my
$sum
=
$#peer
+
1
;
my
$uricrc
=
crc32
("
$url
",
length
(
$url
));
for
(
my
$i
=
0
;
$i
<
$sum
;
$i
++
)
{
my
$peercrc
=
crc32
(
$peer
[
$i
],
length
(
$peer
[
$i
]));
my
$res
=
$peercrc
-
$uricrc
;
if
(
$res
>
0
&&
$res
<
$new
){
$new
=
$res
;
$haha
=
"
$i
\t
$new
";
my
@num
=
split
(
/\t/
,
$haha
);
printf
("
%s cached at the %s peer by the key %010.0f.
\n
",
$url
,
$peer
[
$num
[
0
]],
$uricrc
);
_END_
测试如下:
继续阅读……
今天继续看nginx的consistent_hash_module,因为想可能的话可以把url和对应的peer关系查出来,形成一个类似squidclient一样的方式。以下内容都是我从百度、谷歌、nginx模块应用指南和ngx_upstream_consistent_hash_module的src中自我理解得出的,欢迎指正。
继续阅读……
刚才发现使用perl_set忽略大小写,完全不用perl_module和perl_require那么兴师动众,同样也能达到不错的效果。比如
这个用perl做伪静态路径的例子
。随即就动手试验一下。
继续阅读……
想找找解决不同client请求中文url产生多份cache的办法,结果在nginx的maillist里看到也有人问《
rewrite to lowercase?
》下面有人回答了这个问题,做法和我一样~~呵呵。随后他也附上了这种做法的思路和问题。
继续阅读……
看了看nginx的perl_module,差不多知道了个大概。
在nginx.conf的http域中,通过perl_modules指定模块路径,perl_require指定模块名称;location域中通过perl引用函数。
引用对象为$r->**,列举一下主要的参数:
·$r->args - 返回请求的参数。
·$r->discard_request_body - 告诉nginx忽略请求主体。
·$r->filename - 更具URI的请求返回文件名。
$r->has_request_body(function) - 如果没有请求主体,返回0,但是如果请求主体存在,那么建立传递的函数并返回1,在程序的最后,nginx将调用指定的处理器。
·$r->header_in(header) - 检索一个HTTP请求头。
·$r->header_only - 在我们只需要返回一个应答头时为真。
·$r->header_out(header, value) - 设置一个应答头。
·$r->internal_redirect(uri) - 使内部重定向到指定的URI,重定向仅在完成perl脚本后发生。
·$r->print(args, …) - 为客户端传送数据。
·$r->request_body - 在请求主体未记录到一个临时文件时为客户返回这个请求主体。为了使客户端的请求主体保证在内存里,可以使用client_max_body_size限制它的大小并且为其使用的缓冲区指定足够的空间。
·$r->request_body_file - 返回存储客户端需求主体的文件名,这个文件必须在请求完成后被删除,以便请求主体始终能写入文件,需要指定client_body_in_file_only为on。
·$r->request_method - 返回请求的HTTP动作。
·$r->remote_addr - 返回客户端的IP地址。
·$r->rflush - 立即传送数据到客户端。
·$r->sendfile(file [, displacement [, length ] ) - 传送给客户端指定文件的内容,可选的参数表明只传送数据的偏移量与长度,精确的传递仅在perl脚本执行完毕后生效。
·$r->send_http_header(type) - 为应答增加头部,可选参数“type”在应答标题中确定Content-Type的值。
·$r->sleep(milliseconds, handler) - 设置为请求在指定的时间使用指定的处理方法和停止处理,在此期间nginx将继续处理其他的请求,超过指定的时间后,nginx将运行安装的处理方法,注意你需要为处理方法通过一个reference,在处理器间转发数据你可以使用$r->variable()。
·$r->status(code) - 设置HTTP应答代码。
·$r->unescape(text) - 以%XX的形式编码text。
·$r->uri - 返回请求的URI。
·$r->variable(name[, value]) - 返回一个指定变量的值,变量为每个查询的局部变量。
继续阅读……
在配置squid.conf的refresh_pattern或者url_regex的时候,我们习惯性的都会加上一个options:“-i”,用于忽略大小写。
前不久配置nginx.conf的location时,也用上了~*忽略大小写。
但是这个“忽略大小写”,其实只是整个请求处理流程中部分过程——配置规则的匹配过程——中的忽略。
在使用了这些options以后,一个http://www.test.com/a.htm和另一个http://www.test.com/A.HTM请求在到达squid/nginx的时候,会统一无视大小写的进行规则匹配,然后可能proxy_pass到oringin获取数据;接下来有两种情况:
oringin是windows主机,不区分大小写,返回200数据,缓存下来——分别是a和A两份!
oringin是类unix主机,区分大小写,返回一个正确的200,一个错误的404……甚至可能两个都404~~
(根据测试,完整的url中,host是不用区分大小写的,url_path里的大小写才有影响)
如果要让同样的内容就缓存一份数据,我想就只能在squid/nginx内核在处理url之前,将url的大小写问题处理掉。
继续阅读……
这种email报警脚本遍地都是,很多用的sendmail、postfix,感觉有些大材小用了;也有些用perl的NET::SMTP和Authen::SASL模块发信的,不过我perl用的不好,老发出些莫名其妙的邮件来(比如if(a>1){print(a);},最后邮件里的显示的是0.99……);最后采用sendEmail这个成型的perl程序发信报警,而实时监控部分回归shell,终于完成。
继续阅读……
nginx是著名的非专职全七层负载均衡器,在用惯了四层LVS后,终于碰上了麻烦:LVS后端的4台RS磁盘都较小(20G),跑不到一天就塞满了东西;而根据预估,实际上一天时间该节点也就只有20G的文件增长。很显然,因为lvs转发的轮询算法,导致RS重复缓存了相同的文件。
继续阅读……
看到windows live writer也支持wordpress,感觉这个博客系统确实流行,决定自己也试一把~install时,出了点问题,选择好sqlname和user、passwd信息后,另存为wp-config.php,next生成管理账户和密码的页面,居然顶上出现了“Warning: Cannot modify header information - headers already sent by …”,无视之,记下随机密码,下一步login——彻底废了,整个页面都是这个warning提示~~
继续阅读……
wget http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz
wget http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz
wget http://pecl.php.net/get/memcache-2.2.5.tgz
tar zxvf libevent-1.4.13-stable.tar.gz
tar zxvf memcached-1.4.4.tar.gz
cd libevent-1.4.13-stable
./configure --prefix=/usr
make install
ln -s /usr/lib/libevent-1.4.so.2 /usr/lib64/libevent-1.4.so.2
cd memcached-1.4.4
./configure --prefix=/home/memcached --enable-64bit
make install
/home/memcached/bin/memcached -d -m 1024 -p 11211 -u root
参数说明:
-d 启动为守护进程
-m 分配给Memcached使用的内存数量,单位是MB,默认为64MB
-u 运行Memcached的用户,仅当作为root运行时
-l 监听的服务器IP地址,默认为环境变量INDRR_ANY的值
-p 设置Memcached监听的端口,最好是1024以上的端口
-c 设置最大并发连接数,默认为1024
-P 设置保存Memcached的pid文件,与-d选择同时使用
继续阅读……
cacti运行在lamp环境下,采用net-snmp获得监控数据,由rrdtool绘图。所以cacti的安装,主要就是apache、mysql、php、rrdtool、net-snmp这几个的安装。其中apache2是我们服务器上早就有的,可以利用;而原有的php5因为不支持mysql,所以要重新编译。
继续阅读……
今天偷菜极不顺利,QQ空间老坏,看着那个Qhttpd的502提示页面就郁闷,决定自己也安一个看看。
http://www.qdecoder.org/qhttpd/download.qsp
话说网上人都说QQ的视频服务器用的是qhttpd,Qzone用的是自己的qzhttpd呀。为啥农场的错误是qhttpd呢?
以上,过完年在说。呵呵
过年回来鸟去韩国下载了qhttpd来看,默认安装配置什么的,真的超级简单——功能也超级简单(连logformat都没有)。如果想要玩出花样来,好吧,从源代码开始,慢慢写C去吧~
继续阅读……
之前的系列文章,只涉及squid本身,今天突然想到,其实这个网站加速,除了squid缓存这种缩短传输距离的办法以外,还有另一个办法——压缩内容以缩短传输时间。
而糟糕的问题是,squid对压缩内容的缓存,限制多多。因为squid默认是以HTTP/1.0进行内容传输的,对HTTP/1.1协议兼容性不怎么滴一个不小心,browser就会接受到squid交给它的无法理解的内容,并忠实的把这个错乱信息显示给网民……然后你就等着客户投诉电话吧
这个具体的限制就是:squid只支持静态压缩,不支持动态压缩。反应到header上,就是rep_header里必须指明Content-length是多少多少,不能采用Transfer-Encoding: chunked这样的动态块格式;rep_header里必须指明Vary是Accept-Encoding,而不能是其他的User-Agent等等。
继续阅读……
上回编译加载tcmalloc后,效果各有不同,所以还得细分具体运行情况,以便之后继续优化。
之前的架构是1个lvs下挂6台leaf+1台parent。现在已经给7台squid都加载tcmalloc了。leaf运行上佳,CPU占用率甚至降到了2%,loadavg也不过0.2。但parent的CPU占用率虽然降低,loadavg却依然在1以上——这对于单核服务器来说,可不是什么好事。分析日志,或者用squidclient分析cache情况,leaf如下:
cat access.log |awk ‘{if(/NONE/){a[NONE]++}}END{print a[NONE]/NR}’
0.981347
squidclient -p 80 mgr:info
Cache information for squid:
Request Hit Ratios: 5min: 97.8%, 60min: 98.3%
Byte Hit Ratios: 5min: 97.8%, 60min: 98.2%
Request Memory Hit Ratios: 5min: 85.8%, 60min: 86.8%
Request Disk Hit Ratios: 5min: 9.8%, 60min: 9.1%
Storage Swap size: 19891740 KB
Storage Mem size: 1048572 KB
Mean Object Size: 9.67 KB
可以看到缓存文件的平均大小不足10KB,绝大多数的请求都在内存中处理掉了。所以在加载了优化内存反应速度的tcmalloc后,效果那么明显。
parent如下:
$ cat access.log |awk ‘{if(/NONE/){a[NONE]++}}END{print a[NONE]/NR}’
0.179209
$ squidclient -p 80 mgr:info
Cache information for squid:
Request Hit Ratios: 5min: 31.1%, 60min: 32.3%
Byte Hit Ratios: 5min: 38.4%, 60min: 36.9%
Request Memory Hit Ratios: 5min: 7.8%, 60min: 12.2%
Request Disk Hit Ratios: 5min: 32.7%, 60min: 37.9%
Storage Swap size: 40300232 KB
Storage Mem size: 524284 KB
Mean Object Size: 11.68 KB
只有30%的缓存命中,而且基本还都是从磁盘读取的(awk结果排除了REFRESH_HIT,所以更低)。难怪上次优化没什么效用了……
为了保证服务,先给这组服务器加上了round-robin的双parent。新parent的硬件情况和老的一样。而squid配置上,则采用了aufs方式,不再使用diskd方式。运行到现在30个小时,分析如下:
$ cat /cache/logs/access.log |awk ‘{if(/NONE/){a[NONE]++}}END{print a[NONE]/NR}’
0.238754
$ squidclient -p 80 mgr:info
Cache information for squid:
Request Hit Ratios: 5min: 22.7%, 60min: 22.8%
Byte Hit Ratios: 5min: 22.9%, 60min: 20.1%
Request Memory Hit Ratios: 5min: 22.2%, 60min: 24.3%
Request Disk Hit Ratios: 5min: 64.4%, 60min: 65.0%
Storage Swap size: 4640308 KB
Storage Mem size: 1048588 KB
Mean Object Size: 9.08 KB
继续阅读……