• 用Varnish搭建Cache服务器 - [技术笔记]

    2008-10-10

    分类: 技术笔记

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://iyubo.blogbus.com/logs/30103691.html

    前段时间图片服务器的连接数已经接近4W了(Windows服务器),为了减轻图片服务器的压力,尝试着用Varnish安装了一台Cache服务器用于图片的Cache,上线以后使用稳定,表现良好。先写下安装配置文档,还在精进中……欢迎大家互相交流

    安装环境
    操作系统: CentOS release 5.2 (Final)
    Kernel: 2.6.18-92.1.6.el5PAE

    软件列表
    varnish-1.1.2.tar.gz

    软件存放位置
    /data/software

    安装过程
    #/usr/sbin/groupadd www -g 48
    #/usr/sbin/useradd -u 48 -g www www
    #mkdir -p /var/vcache
    #chmod +w /var/vcache
    #chown -R www:www /var/vcache
    #mkdir -p /var/log/varnish
    #chmod +w /var/log/varnish
    #chown -R www:www /var/log/varnish
    #cd /data/software
    #tar zxvf varnish-1.1.2.tar.gz
    #cd varnish-1.1.2
    #./configure --prefix=/usr/local/varnish
    #make && make install

    编辑Varnish配置文件
    #vi /usr/local/varnish/vcl.conf

    backend webserver {
           set backend.host = "10.10.10.8";
           set backend.port = "80";
    }

    acl purge {
           "localhost";
           "127.0.0.1";
           "10.10.10.0"/24;
    }

    sub vcl_recv {
            remove req.http.X-Forwarded-For;
            set    req.http.X-Forwarded-For = client.ip;
            if (req.request == "PURGE") {
                   if (!client.ip ~ purge) {
                           error 405 "Not allowed.";
                   }
                   lookup;
           }

           if (req.http.host ~ "(a|b|c).test.com") {
                   set req.backend = webserver;
                  if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {
                           lookup;
            }
                   else {
                           pass;
                   }
           }

           else {
                   error 404 "Test Cache Server";
                   pipe;
           }
    }

    sub vcl_hash {
        set req.hash += req.url;
        if (req.http.host) {
            set req.hash += req.http.host;
        } else {
            set req.hash += server.ip;
        }
        hash;
    }

    sub vcl_pipe {
            set req.http.connection = "close";
            #pipe;
    }

    sub vcl_hit {
            if (!obj.cacheable) {
                    pass;
            }
           if (req.request == "PURGE") {
                   set obj.ttl = 0s;
                   error 200 "Purged.";
           }
            deliver;
    }

    sub vcl_miss {
           if (req.request == "PURGE") {
                   error 404 "Not in cache.";
           }
    }

    sub vcl_fetch {
                   set obj.ttl = 180s;
                   #set    obj.http.X-Varnish-IP = server.ip;
                   set    obj.http.Varnish = "Tested by Kevin";
    }

    启动Varnish
    #/usr/local/varnish/sbin/varnishd -n /var/vcache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -s file,/var/vcache/varnish_cache.data,4G -u apache -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on -p thread_pools=4

    启动日志记录
    #/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/log/varnish/varnish.log &

    补充几条相关命令
    查看Varnish状态
    /usr/local/varnish/bin/varnishstat -n /var/vcache/

    查看访问最多的Referer
    /usr/local/varnish/bin/varnishtop -n /var/vcache/ -i rxheader -I Referer

    查看访问最多的URL
    /usr/local/varnish/bin/varnishtop -n /var/vcache/ -i rxurl

    参考文档
    使用Varnish代替Squid做网站缓存加速器的详细解决方案[原创]

    遇到的问题(欢迎讨论)
    记录日志时总是到达2G大小以后就无法记录了
    vcl.conf的使用还需要精进

    收藏到:Del.icio.us




    评论

  • Kevin回复sery说:
    我还没遇到过这个问题,不过看上去像是内核报的。有条件的话在测试机上装个新的系统试试能不能重现。另外,看看你出这个问题的时候的内存使用情况,我怀疑跟内存有关
    2009-11-02 23:29:15


    我用了6个机器 都有这个问题。
    有点奇怪的是 当我把这些机器从负载均衡集群隔离后 则无此报错
  • 谢谢回复。
    我现在用了64位的系统,但执行 varnishadm -T 127.0.0.1:3500 url.purge *$
    时 出现系统错误 kernel: varnishd[5223]: segfault at 00000000000000d8 rip 00000037cdeb8406 rsp 0000000046fc7b30 error 6 请问是否遇到这样的问题 怎么解决? 万分感谢
    Kevin回复sery说:
    我还没遇到过这个问题,不过看上去像是内核报的。有条件的话在测试机上装个新的系统试试能不能重现。另外,看看你出这个问题的时候的内存使用情况,我怀疑跟内存有关
    2009-11-02 23:29:15
  • varnish 在32位的系统只能到2G。请问你怎么到的4G?谢谢
    Kevin回复sery说:
    是的,我这篇文章可能是很早写的,后来改过。4G的参数是在64位的系统启动时用的,在32位的系统上启动时超过2G的也只能用2G
    2009-11-02 21:20:06
  • 你的Varnish并发到4w后dmesg会出现
    TCP: Treason uncloaked! Peer 125.76.215.85:6835/80 shrinks window 4164311748:4164314652. Repaired.
    这类的错误么....我常常会0碰见...
    Kevin回复稀饭说:
    还没有遇到过,Google没有么?出现这个报错的时候影响服务么?
    2009-10-25 23:09:21