squid3新acl类型http_status试用(源站故障转向研究)

09 Jan 2010 Posted in  squid

今天试着自己编译安装了squid3.1,然后开始移植2.6的配置文件。在squid.conf.document(2.6里的squid.conf.default)里看了很久,发现不少新东西。跟转向有关的,便发现一个: 继续阅读……


虚拟机时间问题的机制原理及解决办法

05 Jan 2010 Posted in  cloud

对于CDN来说,时间是个非常重要的概念,squid的缓存刷新控制,全都是以服务器时间为基准。在我博客的前不知道几篇的某文中,就提到过因为时间的原因引起的刷新事故。而最新的一次,是公司在日志流量统计时,因为相差太大导致截取失败——这可都是钱呢。 实际工作中,大多会搭建一个NTP服务器,给应用服务器提供时间同步服务。但虚拟机在这方面有个问题。虚拟机的时间是读取的宿主机的硬件时钟,随便你date -s 1234怎么改,下一次date查看,都会恢复成原样。 这样看起来是个好事,因为这样可以省略掉大批机器的NTP服务器同步时间的压力。但糟糕的事情在后头:一大批重要客户的虚拟机,在运行上半年以上时间后,date都比真实时间超前了(偶然我也看到过一次滞后的)。或许是几分钟,或许是几小时!! 这一度让我很无奈,因为即使我重启虚拟机,这个诡异的date也依然倔强的按照它自己的时钟前进。看起来办法只有一个:把虚拟平台整个的重启——好在这种试验的结果是有效的,不然真不知道怎么办了。 从这个无奈的办法中,也应该可以推测出一个结论,虚拟机的时钟,应该是另有文件存储在虚拟平台的某个临时文件里。所以关闭虚拟机,该文件还存在并继续计时;重启动虚拟平台,该文件才会重计。至于这个文件叫什么,存放在哪里,一时半会我就找不到了,或许这个问题不算什么特别大的问题,至少我在linuxsir.org的《xen初学指南》中,没有找到关于时钟的配置说明。 不过再小的问题也顶不住人的研究。于是我找到了另一篇很对口的文章:《虚拟机中GUEST OS时钟(TIMEKEEP)问题的探讨》。 文章告诉我们:虚拟机的时钟,与真实机的时钟区别,其一在于其处理不是抢占中断而是延迟处理;其二在于其中断模拟软件可能因资源占用问题被推迟。 这两点区别,导致的结果却是一个,就是一旦服务器负载变高,时钟中断就被排到后头去了…… 文章也提出了解决办法,一个是编程,让系统补上中断的时间,这个俺就不说了;一个是修改内核,让系统不断修正date; 进一步问题:不管哪个办法,第一,加重了虚拟机负载;第二,这又依赖与系统去更新date的进程的精准度,而这个进程的中断时钟如果有偏差的话,…… 再进一步方法……有兴趣的还是自己点文章看吧。 看起来这个问题就要永远终结在此了。 不过变通的主意及时的出现了——既然虚拟机跟虚拟平台之间的异步时钟同步没法解决,我们就干脆不要虚拟机跟虚拟平台同步了。这样虽然对NTP的压力大了,但毕竟保证了CDN的正常。而且从上头的原理可以知道,能够导致date偏差到这个程度的原因,大概也是因为虚拟机的负载压力太大。事实上,我们为了保证冗余,也是尽量避免这种压力出现的。那么date偏差的服务器,其实也就是少数了。 顺着这个思路一查,原来办法其实很简单——修改虚拟机的independent_wallclock值即可: echo 1 > /proc/sys/xen/independent_wallclock 或sysctl xen.independent_wallclock=1 启用虚拟机独立系统时间; /etc/init.d/ntpd stop ntpdate 192.168.0.1 就能完成NTP时间同步了; 再date看看,时间果然就更正了~~ /proc下的文件都是进程使用中的文件,如果要让虚拟机开机自动读取配置,把这个修改写进/etc/sysctl.conf才行哦: echo “xen.independent_wallclock = 1” » /etc/sysctl.conf 就这么简单~~~ 继续阅读……


squid限速

01 Jan 2010 Posted in  squid

squid有个delay_pool,可以做限速,虽然效果不太准~(嗯,就像限制并发连接数的maxconn一样) 首先搬个老虎皮做大旗——《Squid: The Definitive Guide》的相关段落: 继续阅读……


squid请求处理流程(源站故障转向研究)

31 Dec 2009 Posted in  squid

今天继续想别的办法,第一,当然还是修改源代码,这个C++可惜俺不懂,只是大略的通过百大哥谷大婶知道了squid的请求处理流程: 继续阅读……


awk中让人郁闷的system()函数

30 Dec 2009 Posted in  bash

发现一个特尴尬的事实。我辛辛苦苦去百度资料,想用rewrite实现针对不同域名源站故障后的自动跳转功能,但整个思路里遗漏了一个严重的问题。 继续阅读……


squid3 的 gzip 支持

30 Dec 2009 Posted in  squid

标题很简单,内容很复杂,而且我也用不上。姑且存档吧: 原标题《VIGOS eCAP GZIP Adapter for SQUID Proxy Cache》 第一句话就让我很绝望,本插件只适用于squid3.1及以上版本——squid有比3.1更高的版本么——前文提到的有session控制的squid2.7我都还没看呢~哭 继续阅读……


url_rewrite_program(squid游戏恶搞~)

30 Dec 2009 Posted in  squid

标题很引人吧。其实是我在查找squid的rewrite资料时,看到的一篇文章。原作者突发奇想,准备让公司的同事们上网时,看到的所有图片全都倒过来180°。嘿嘿,小样,还不拧断你们脖子~~ 继续阅读……


url_rewrite_program(首次访问跳转)

30 Dec 2009 Posted in  squid

上文提到,squid大多数的rewrite_program是用perl编写的。现在就转几个简洁明了的redirect.pl。虽说我至今没把perl基础教程看完。不过从中领会一下squid的rewrite流程,还是可以的: 继续阅读……


squid_session(首次访问跳转)

30 Dec 2009 Posted in  squid

上文perl例二中提到的第一次上某网站时先跳转公司主页。在CU上看到另一种办法。即在squid2.7以上版本中,有个squid_session。操作如下: 首先是安装: 安装squid ( for 2.7 stable ) 修改源代码:vi src/errorpage.c 60行处将 继续阅读……


nginx502错误

30 Dec 2009 Posted in  nginx

NGINX 502 Bad Gateway错误是FastCGI有问题,造成NGINX 502错误的可能性比较多。将网上找到的一些和502 Bad Gateway错误有关的问题和排查方法列一下,先从FastCGI配置入手: 继续阅读……



查看一些常见应用的编译选项

13 Dec 2009 Posted in  linux

  • nginx:
    [rao@localhost ~]$ /home/nginx/sbin/nginx -V|grep conf
    nginx version: 0.7.54
    built by gcc 4.1.2 20080704 (Red Hat 4.1.2-44)
    configure arguments: --prefix=/home/nginx --with-pcre
    --with-http_stub_status_module --without-http_memcached_module
    --without-http_fastcgi_module
    apache:
    [rao@localhost ~]$ cat /home/apache2/build/config.nice
    #! /bin/sh
    #
    # Created by configure
    CFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"; export
    CFLAGS
    "./configure"
    "--prefix=/home/apache2"
    "--enable-static-support"
    "--enable-rewrite"
    "--with-mpm=worker"
    "--enable-logio"
    "--enable-so"
    "--enable-mime-magic"
    "--disable-cgid"
    "--disable-cgi"
    "--disable-userdir"
    "--disable-dir"
    "--disable-include"
    "--disable-filter"
    "--disable-env"
    "--disable-setenvif"
    "--disable-status"
    "--disable-autoindex"
    "--disable-asis"
    "--disable-alias"
    "--disable-actions"
    "--disable-authn-file"
    "--disable-authn-default"
    "--disable-authz-default"
    "--disable-authz-groupfile"
    "--disable-authz-user"
    "--disable-auth-basic"
    "CFLAGS=-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
    "$@"
    
  • php:
[rao@localhost ~]$ php -i|grep configure
Configure Command =>  './configure'
'--build=x86_64-redhat-linux-gnu' '--host=x86_64-redhat-linux-gnu'
'--target=x86_64-redhat-linux-gnu' '--program-prefix='
'--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin'
'--sbindir=/usr/sbin' '--sysconfdir=/etc' '--datadir=/usr/share'
'--includedir=/usr/include' '--libdir=/usr/lib64'
'--libexecdir=/usr/libexec' '--localstatedir=/var'
'--sharedstatedir=/usr/com' '--mandir=/usr/share/man'
'--infodir=/usr/share/info' '--cache-file=../config.cache'
'--with-libdir=lib64' '--with-config-file-path=/etc'
'--with-config-file-scan-dir=/etc/php.d' '--disable-debug'
'--with-pic' '--disable-rpath' '--without-pear' '--with-bz2'
'--with-curl' '--with-exec-dir=/usr/bin' '--with-freetype-dir=/usr'
'--with-png-dir=/usr' '--enable-gd-native-ttf' '--without-gdbm'
'--with-gettext' '--with-gmp' '--with-iconv' '--with-jpeg-dir=/usr'
'--with-openssl' '--with-png' '--with-pspell'
'--with-expat-dir=/usr' '--with-pcre-regex=/usr' '--with-zlib'
'--with-layout=GNU' '--enable-exif' '--enable-ftp'
'--enable-magic-quotes' '--enable-sockets' '--enable-sysvsem'
'--enable-sysvshm' '--enable-sysvmsg' '--enable-track-vars'
'--enable-trans-sid' '--enable-yp' '--enable-wddx'
'--with-kerberos' '--enable-ucd-snmp-hack'
'--with-unixODBC=shared,/usr' '--enable-memory-limit'
'--enable-shmop' '--enable-calendar' '--enable-dbx' '--enable-dio'
'--with-mime-magic=/usr/share/file/magic.mime' '--without-sqlite'
'--with-libxml-dir=/usr' '--with-xml' '--with-system-tzdata'
'--enable-force-cgi-redirect' '--enable-pcntl' '--with-imap=shared'
'--with-imap-ssl' '--enable-mbstring=shared'
'--enable-mbstr-enc-trans' '--enable-mbregex'
'--with-ncurses=shared' '--with-gd=shared' '--enable-bcmath=shared'
'--enable-dba=shared' '--with-db4=/usr' '--with-xmlrpc=shared'
'--with-ldap=shared' '--with-ldap-sasl' '--with-mysql=shared,/usr'
'--with-mysqli=shared,/usr/bin/mysql_config' '--enable-dom=shared'
'--with-dom-xslt=/usr' '--with-dom-exslt=/usr'
'--with-pgsql=shared' '--with-snmp=shared,/usr'
'--enable-soap=shared' '--with-xsl=shared,/usr'
'--enable-xmlreader=shared' '--enable-xmlwriter=shared'
'--enable-fastcgi' '--enable-pdo=shared'
'--with-pdo-odbc=shared,unixODBC,/usr'
'--with-pdo-mysql=shared,/usr' '--with-pdo-pgsql=shared,/usr'
'--with-pdo-sqlite=shared,/usr' '--enable-dbase=shared'
  • mysql: 据网上都说是cat /usr/bin/mysqlbug|grep conf,但我这的结果是压根没用……
继续阅读……

引号的魔力

04 Dec 2009 Posted in  bash

[root@neteasesquid1 ~]# i=1.2.3.4;awk -v OFS="tt" 'BEGIN{print '"$i"',"'"$i"'","'$i'",""'$i'""}'
1.20.30.4
1.2.3.4
1.2.3.4
1.20.30.4

以前用awk调用shell变量时,一般都是文字字符串,看不出什么问题来;今天突然用上ip,发现输出结果显示不正常。于是做了如上实验。 但是原因嘛,还是不知道…… 继续做下一个实验: 继续阅读……


sed子命令集

23 Nov 2009 Posted in  bash

1.: 用法: :lable 在脚本中标记一行,用于实现由b或t的控制转移。Label最多可以包含7个字符 继续阅读……


一种CDN中的动态数据存储方案——UbDP

22 Nov 2009 Posted in  CDN

上回百度到这篇文章,于是上维普下载了来看,为方便阅读,贴在这里。 继续阅读……


nginx编译优化压力测试(转)

21 Nov 2009 Posted in  nginx

默认nginx使用的GCC编译参数是-O,需要更加优化可以使用以下两个参数: 继续阅读……


squidclient用法

21 Nov 2009 Posted in  squid

squidclient是squid自带的一个小工具,一般用的最多的,就是-m purge URL了。 其实还有别的用法(看看help吧,不过这个慢慢来~~)先说一个大全式的用法(其他的具体用法,大不了用这里rep出来好了):squidclient -p 80 mgr:info,显示如下: 继续阅读……


让squid访问日志显示完整url

21 Nov 2009 Posted in  squid

一大串的header结束了,从上篇开始回到squid.conf本身的设置上来。 继续阅读……


cache驻留时间(四、If-Modified-Since)

21 Nov 2009 Posted in  CDN

话接上回If-Modified-Since,当squid开启reload_into_ims on之后,no-cache头会在在浏览器上被转化成If-Modified-Since标识返回给web服务器。从整体架构考虑,因为squid上已经破坏了http协议的规定,那么web端就必须主动承担对网页过期的识别管理工作。嗯,要是所有的网站都能从一规划开始就这么搞,俺们干CDN的可就轻松了~~~ 继续阅读……


cache驻留时间(五、Etag)

21 Nov 2009 Posted in  CDN

浏览器的请求中,除了用If-Modified-Since去比对Last-Modified以外,还有另一个标签Etag,这个东东是web服务器比较有用的,squid倒没什么。不过大文件下载加速也有采用apache的系统,一并算在cache缓存里头讲吧: 继续阅读……


cache驻留时间(六、大文件)

21 Nov 2009 Posted in  CDN

话说上回提到大文件下载,公司除了apache以外,有些也是用squid做的。这回说说这方面的设置。 下载业务,首先要注意到的,第一是多线程,第二是断点续传。 继续阅读……


cache驻留时间(三、Expires/Cache-Control)

20 Nov 2009 Posted in  CDN

在谈cache的时候插入了上一篇回忆正则表达式的内容,是因为最近一个客户的古怪要求“url以/结尾或文件夹结尾的不能缓存”。 继续阅读……


awk单行实践

19 Nov 2009 Posted in  bash

客户提交一份预加载文件列表,采用了如下格式: http://www.a.com/a/b/ a b c d e f g h i j k l m n http://www.b.com/b/c/ o p q r s t u v w x y z http://www.c.com/d/e http://www.d.com/f/g 必须要把文件整理成完整的url,才好操作。 最初的设想,是以带http开头的行为RS,以n为OFS,然后打印RS $0。随后发现这个想法问题多多——最主要的一点是:直接print $0的话,输出结果是不显示OFS的。 然后我才想到用for循环打印所有列的话,默认就已经分行了,不用定义OFS和ORS。 剩下的问题就是RS,然而不管我怎么写正则匹配表达式,结果都搞不定……唉 最后只能放弃这个想法,采用比较繁琐的办法: 继续阅读……


正则表达式

19 Nov 2009 Posted in 

系统整理一下正则表达式: “.”匹配除了”n”以外的任一字符; “”匹配前一字符任意次;【“.”匹配任意个字符】 “^”匹配行首; “$”匹配行尾;【“^$”匹配空行】 “[ ]”匹配其中某个字符;【“[^ ]”匹配此外任一字符】 “”匹配单词边界,即完整单词; “?”匹配前一字符0或1次; “+”匹配前一字符非0次;【可能要用转义一下】 “{ }”匹配次数; 继续阅读……


cache驻留时间(二、LM-factor算法)

19 Nov 2009 Posted in  CDN

好吧,满足某人的好奇,花开两朵,各表一枝了。 今天又看到关于LM-factor的另一种说法,特摘录如下: 上面这张图来自于《Squid.Definitive.Guide》第七章,对squid的LM-factor算法作出了一个很直观的描述。 请注意这张图的起始时间坐标:Last-Modified,这个是由squid读取的原始web数据所规定的。 然后就是Date,这个是原始数据进入squid的缓冲的时间。 最后就是Expires,这个就是原始数据在squid中的缓冲过期时间。 可以很容易的得出结论,对于LM-factor算法来说,原始数据在squid中的缓冲时间为 (原始数据进入squid的缓冲的时间-原始web数据所规定的Last-Modified时间)percent 所以,我们可以郑重得出结论,在squid的refresh_pattern设置中,percent与Min、Max两个值是完全没有关系! 最后总结一下,对于squid来说,缓冲的数据在cache中的存活时间是这样决定的: 如果有定义refresh_pattern:只要满足以下两个条件之一,缓冲对象过期 缓冲对象在squid的cache缓冲的时间大于refresh_pattern定义的max 缓冲对象在squid的cache缓冲的时间大于(原始数据进入squid的缓冲的时间-原始web数据所规定的Last-Modified时间)percent 用编程语言来描述,就是 if ((CURRENT_DATE-DATE) elif ((CURRENT_DATE-DATE)/(DATE-LM_DATE) elif ((CURRENT_DATE-DATE)>max){STABLE} else{STABLE} 继续阅读……