第一种扩展形式,按长度截取:${PARAMETER:OFFSET:LENGTH};例: 继续阅读……
09 Feb 2010 Posted in web
今天偷菜极不顺利,QQ空间老坏,看着那个Qhttpd的502提示页面就郁闷,决定自己也安一个看看。
http://www.qdecoder.org/qhttpd/download.qsp
话说网上人都说QQ的视频服务器用的是qhttpd,Qzone用的是自己的qzhttpd呀。为啥农场的错误是qhttpd呢?
以上,过完年在说。呵呵
过年回来鸟去韩国下载了qhttpd来看,默认安装配置什么的,真的超级简单——功能也超级简单(连logformat都没有)。如果想要玩出花样来,好吧,从源代码开始,慢慢写C去吧~
继续阅读……
09 Feb 2010 Posted in CDN
之前的系列文章,只涉及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等等。
继续阅读……
06 Feb 2010 Posted in squid
上回编译加载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 继续阅读……
06 Feb 2010 Posted in linux
04 Feb 2010 Posted in squid
话接上文,同一组LVS下,昨天采用重编译方式部署了另一台squid服务器。同样跑上一天,再次对比一番。今天流量比上回稍微少些,未加载的服务器cacti监控截图如下:
CPU占用率
=====================
负载
继续阅读……
01 Feb 2010 Posted in squid
昨天下午在一台squid上加载了tcmalloc。运行到现在,整整一天时间。现取LVS下与其完全相同配置的另一台未加载tcmalloc的squid服务器进行比较。
环境说明:
CPUinfo:Intel(R) Xeon(R) CPU E5405 @ 2.00GHz
MEM:4G
SQUID:Version 2.6.STABLE21
当单台流量20M,TCP连接数6w时,未加载tcmalloc的服务器CPU占用率和负载情况如下图:
CPU占用率
负载
继续阅读……
31 Jan 2010 Posted in squid
GADMIN-SQUID 在linux环境下运行,经本人下载src后看,只能用于本机squid管理,不支持批量…… 继续阅读……
31 Jan 2010 Posted in squid
TCMalloc(Thread-Caching Malloc)是google开发的开源工具──“google-perftools”中的成员。其作者宣称tcmalloc相对于glibc2.3 malloc(aka-ptmalloc2)在内存的分配上效率和速度有6倍的性能提高,tcmalloc的常用场景是用于加速MySQL,不过据Wikipedia的hacker(Domas Mituzas)说,tcmalloc不仅仅对MySQL起作用,对squid也同样起作用(网上也有很多人在nginx上启用tcmalloc了),不过目前squid并没有official way来使用tcmalloc。
TCMalloc的实现原理和测试报告请见一篇文章:《TCMalloc:线程缓存的Malloc》
那么让我们赶紧给squid加载上tcmalloc,提高cache服务器在高并发情况下的性能,降低系统负载吧。
因为服务器是64位OS,所以要先安装libunwind库。libunwind库为基于64位CPU和操作系统的程序提供了基本的堆栈辗转开解功能,其中包括用于输出堆栈跟踪的API、用于以编程方式辗转开解堆栈的API以及支持C++异常处理机制的API。(又cp一句话,^=^)
bashwget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99.tar.gz
tar zxvf libunwind-0.99.tar.gz
cd libunwind-0.99/
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install
普通的./configure&&make&&make install可不行哟~
然后开始安装tcmalloc:
bashwget http://google-perftools.googlecode.com/files/google-perftools-1.8.1.tar.gz
tar zxvf google-perftools-1.8.1.tar.gz
cd google-perftools-1.8.1/
./configure --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --enable-minimal --disable-dependency-tracking
make && make install
然后配置动态链接库,因为是之前是默认安装,这里自然就是/usr/local/lib了。
bashecho "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
/sbin/ldconfig
然后给squid加载tcmalloc。官方推荐是重新编译:
先./configure,然后vi src/Makefile,修改如下:
继续阅读……
31 Jan 2010 Posted in squid
在linuxtone论坛上,偶见一贴,说采用如下配置,browser就可以正常遵守originserver的过期设置,而且充分利用browser本身的缓存设置,对server来说就可以达到减少304请求的效果,从而提升机器性能,节省带宽云云…… 继续阅读……
31 Jan 2010 Posted in CDN
服务器防盗链设置,从最简单的referer判断,到进阶的key+time生成md5值,应该说是比较可靠了,而还有一种防盗链方式,基于IP/COOKIE的,这个我没找到太多有用信息,似乎IIS有个相关插件? 只看到一篇squid的相关文章,简单的举了个防盗链的例子,未必有效(因为把cookie做明文处理,相比md5加密实在是防君子不防小人)。倒是从中学习一下external_acl_type用法,对squid进阶一番罢~~ 首先按惯例,上权威:《squid中文权威指南》6.1.3章节和12.5章节。 用法如下: external_acl_type name [options] FORMAT.. /path/to/helper [helper arguments..] options包括:ttl、negtive_ttl、children、concurrency、cache和grace; FORMAT包括:%LOGIN,%EXT_USER,%IDENT,%SRC,%SRCPORT,%DST,%PROTO,%PORT,%METHOD,%MYADDR,%MYPORT,%PATH,%USER_CERT,%USER_CERTCHAIN,%USER_CERT_xx,%USER_CA_xx,%{Header},%{Hdr:member},%{Hdr:;member},%ACL,%DATA。 外部程序输出结果必须是OK或者ERR,不过可以再带上一些keyword,比如user/passwd,ERR的messages,access.log里记录的%ea等等。 cookie防盗链举例squid/libexec/check_cookie.pl如下: 继续阅读……
30 Jan 2010 Posted in linux
ubuntu 9.10下linuxqq(官方的QQ,八百年不更新的那个了) 继续阅读……
30 Jan 2010 Posted in CDN
继续横向比较,之前有squid的限速配置,现在说nginx限速,nginx关于限速的模块有三个:HTTPLimitZoneModule、HTTPCoreModule和HTTPLimitReqModule,详见官方wiki,就不再贴链接了,能不能上天知道,真是地上芙蓉姐,天上绿坝娘呀…… 继续阅读……
30 Jan 2010 Posted in CDN
在折腾squid的rewrite.pl时,参考的是公司原有的一个防盗链脚本。如下: 继续阅读……
29 Jan 2010 Posted in linux
第一个,最常见的cronolog,因为他配对apache,apache太常见,所以cronolog也就常见了~~稳定版本1.6.2,似乎不支持2G以上的日志,因为那时候linux内核也不支持。。。现在有beta版可以,另据网友分析,其实只要修改1.6.2源代码中的openfile函数成openfile64就行了…… 使用方法: 继续阅读……
19 Jan 2010 Posted in linux
tcp_syn_retries :INTEGER 默认值是5 对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1决定的) 继续阅读……
13 Jan 2010 Posted in CDN
这篇博文的起因是最近犯的一个低级错误。某客户要求立刻刷新掉一批url。格式是http://a.b.com/index.jsp?pid=123456&id=654321这样的。 我也没多想,上去就执行“squidclient -p 80 -m purge http://a.b.com/index.jsp?pid=123456&id=654321”。结果硬是刷不掉……明明访问源站已经没有这个url了。我wget居然还能MISS/200~~~ 直到同事提醒。才赫然发现其实我一直在purge和wget的,不是http://a.b.com/index.jsp?pid=123456&id=654321,而是http://a.b.com/index.jsp?pid=123456。linux把url里的&当作后台运行的命令执行了……而access.log中为了安全又没记录?后的具体参数,于是傻傻的跟客户客服扯皮了N久…… “squidclient -p 80 -m purge ‘http://a.b.com/index.jsp?pid=123456&id=654321’”这么一刷立刻就好了~~ 由此告诫自己,以后一定要严谨行事,引号最好还是要养成习惯都给带上~~ 继续阅读……
13 Jan 2010 Posted in CDN
<?php
interface Flush_Cache
{
public function flush($url);
}
class Flush_Cache_HTTP_Header_Impl implements Flush_Cache
{
public function flush($url)
{
if(empty($url))
{
return;
}
$url_component = parse_url($url);
global $g_squid_servers;
foreach ($g_squid_servers as $server)
{
$squid_params = split(':' , $server);
$fsocket = fsockopen($squid_params[0], intval($squid_params[1]), $errono, $errstr, 3);
if(FALSE != $fsocket)
{
$head = "HEAD {$url_component['path']} HTTP/1.1rn";
$head .= "Accept: */*rn";
$head .= "Host: {$url_component['host']}rn";
$head .= "Cache-Control: no-cachern";
$head .= "rn";
echo $head;
fwrite($fsocket , $head);
while (!feof($fsocket))
{
$line = fread($fsocket , 4096);
echo $line;
}
fclose($fsocket);
}
}
}
}
$g_squid_servers = array('192.168.2.88:80');
$flush_cache = new Flush_Cache_HTTP_Header_Impl();
$flush_cache->flush('http://ent.cdqss.com/index.html');
?>
10 Jan 2010 Posted in squid
在找http_status的acl用法时,看到这么一句“This clause supports both fast and slow acl types”。acl还分快慢呢~~赶紧去wiki看:http://wiki.squid-cache.org/SquidFaq/SquidAcl#Fast_and_Slow_ACLs 继续阅读……
09 Jan 2010 Posted in CDN
昨天,突然接到某客户的邮件,表示他们质疑我们cache对其多originserver的轮询不均等,以至于影响到网站的访问。 听起来不是什么难题,把服务器上的DNSCache进程中止掉,不就能平均轮询了么?可是操作完成后,客户依然不认可……于是开始细细探讨具体的错误问题所在。 原来实际情况是这样:点击其网站的回复、收藏等动态页面时,时常会弹出错误页面。对这个错误页面,客户的解释是“session状态CDN加速未保留”。 由此解释,我觉得cache上的问题恰恰相反,正是因为均等轮询了导致的。而客户其他一些单源的域名服务正常,也证明了这点。 上cache服务器查看配置,使用的默认keep-alive设置,也就是对client和origin都开启了keep-alive,默认时间为2min。但实际上并没有起作用。在测试中,可以看到这样的日志: 继续阅读……