系统优化——TCP参数

19 Jan 2010 Posted in  linux

tcp_syn_retries :INTEGER 默认值是5 对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1决定的) 继续阅读……


squid刷新缓存

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’”这么一刷立刻就好了~~ 由此告诫自己,以后一定要严谨行事,引号最好还是要养成习惯都给带上~~ 继续阅读……


刷新squid缓存的php脚本

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');
?>
继续阅读……

Squid的ACL分类

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 继续阅读……


client-cache-origin之间的session问题

09 Jan 2010 Posted in  CDN

昨天,突然接到某客户的邮件,表示他们质疑我们cache对其多originserver的轮询不均等,以至于影响到网站的访问。 听起来不是什么难题,把服务器上的DNSCache进程中止掉,不就能平均轮询了么?可是操作完成后,客户依然不认可……于是开始细细探讨具体的错误问题所在。 原来实际情况是这样:点击其网站的回复、收藏等动态页面时,时常会弹出错误页面。对这个错误页面,客户的解释是“session状态CDN加速未保留”。 由此解释,我觉得cache上的问题恰恰相反,正是因为均等轮询了导致的。而客户其他一些单源的域名服务正常,也证明了这点。 上cache服务器查看配置,使用的默认keep-alive设置,也就是对client和origin都开启了keep-alive,默认时间为2min。但实际上并没有起作用。在测试中,可以看到这样的日志: 继续阅读……


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缓存里头讲吧: 继续阅读……