1. 程式人生 > >使用Varnish代替Squid做網站快取加速器的詳細解決方案 原創

使用Varnish代替Squid做網站快取加速器的詳細解決方案 原創

    [文章作者:張宴 本文版本:v1.2 最後修改:2008.01.02 轉載請註明出處:http://blog.s135.com]  我曾經寫過一篇文章──《初步試用Squid的替代產品──Varnish Cache網站加速器》,但當時僅僅是用著玩,沒做深入研究。  今天寫的這篇關於Varnish的文章,已經是一篇可以完全替代Squid做網站快取加速器的詳細解決方案了。網上關於Varnish的資料很少,中文資料更是微乎其微,希望本文能夠吸引更多的人研究、使用Varnish。  在我看來,使用Varnish代替Squid的理由有三點:  1、Varnish採用了“Visual Page Cache”技術,在記憶體的利用上,Varnish比Squid具有優勢,它避免了Squid頻繁在記憶體、磁碟中交換檔案,效能要比Squid高。  2、Varnish的穩定性還不錯,我管理的一臺圖片伺服器執行Varnish已經有一個月,沒有發生過故障,而進行相同工作的Squid伺服器就倒過幾次。  3、通過Varnish管理埠,可以使用正則表示式快速、批量地清除部分快取,這一點是Squid不能具備的。  
點選在新視窗中瀏覽此圖片
  下面來安裝Varnish網站快取加速器(Linux系統):  1、建立www使用者和組,以及Varnish快取檔案存放目錄(/var/vcache):/usr/sbin/groupadd www -g 48/usr/sbin/useradd -u 48 -g www wwwmkdir -p /var/vcachechmod +w /var/vcachechown -R www:www /var/vcache  2、建立Varnish日誌目錄(/var/logs/):mkdir -p /var/logschmod +w /var/logschown -R www:www /var/logs  3、編譯安裝varnish:wget http://blog.s135.com/soft/linux/varnish/varnish-1.1.2.tar.gz
tar zxvf varnish-1.1.2.tar.gzcd varnish-1.1.2./configure --prefix=/usr/local/varnishmake && make install  4、建立Varnish配置檔案:vi /usr/local/varnish/vcl.conf  輸入以下內容:引用backend myblogserver {         set backend.host = "192.168.0.5";         set backend.port = "80"; }acl purge {        "localhost";        "127.0.0.1";        "192.168.1.0"/24;}sub vcl_recv {        if (req.request == "PURGE") {                if (!client.ip ~ purge) {                        error 405 "Not allowed.";                }                lookup;        }        if (req.http.host ~ "^blog.s135.com") {                set req.backend = myblogserver;                 if (req.request != "GET" && req.request != "HEAD") {                        pipe;                }                else {                        lookup;                }        }        else {                error 404 "Zhang Yan Cache Server";                 lookup;        }}sub vcl_hit {        if (req.request == "PURGE") {                set obj.ttl = 0s;                error 200 "Purged.";        }}sub vcl_miss {        if (req.request == "PURGE") {                error 404 "Not in cache.";        }}sub vcl_fetch {        if (req.request == "GET" && req.url ~ "/.(txt|js)$") {                set obj.ttl = 3600s;        }        else {                set obj.ttl = 30d;        }}  這裡,我對這段配置檔案解釋一下:  (1)、Varnish通過反向代理請求後端IP為192.168.0.5,埠為80的web伺服器;  (2)、Varnish允許localhost、127.0.0.1、192.168.0.***三個來源IP通過PURGE方法清除快取;  (3)、Varnish對域名為blog.s135.com的請求進行處理,非blog.s135.com域名的請求則返回“Zhang Yan Cache Server”;  (4)、Varnish對HTTP協議中的GET、HEAD請求進行快取,對POST請求透過,讓其直接訪問後端Web伺服器。之所以這樣配置,是因為POST請求一般是傳送資料給伺服器的,需要伺服器接收、處理,所以不快取;  (5)、Varnish對以.txt和.js結尾的URL快取時間設定1小時,對其他的URL快取時間設定為30天。  5、啟動Varnishulimit -SHn 51200/usr/local/varnish/sbin/varnishd-n /var/vcache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -sfile,/var/vcache/varnish_cache.data,1G -g www -u www -w 30000,51200,10-T 127.0.0.1:3500 -p client_http11=on  6、啟動varnishncsa用來將Varnish訪問日誌寫入日誌檔案:/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/logs/varnish.log &  7、配置開機自動啟動Varnishvi /etc/rc.local  在末尾增加以下內容:引用ulimit -SHn 51200/usr/local/varnish/sbin/varnishd-n /var/vcache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -sfile,/var/vcache/varnish_cache.data,1G -g www -u www -w 30000,51200,10-T 127.0.0.1:3500 -p client_http11=on/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/logs/youvideo.log &  8、優化Linux核心引數vi /etc/sysctl.conf  在末尾增加以下內容:引用net.ipv4.tcp_fin_timeout = 30net.ipv4.tcp_keepalive_time = 300net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.ip_local_port_range = 5000    65000  再看看如何管理Varnish:
  1、檢視Varnish伺服器連線數與命中率:/usr/local/varnish/bin/varnishstat  點選在新視窗中瀏覽此圖片  2、通過Varnish管理埠進行管理:  用help看看可以使用哪些Varnish命令:/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 help引用Available commands:ping [timestamp]statusstartstopstatsvcl.load  vcl.inline  vcl.use vcl.discard vcl.listvcl.show param.show [-l] []param.sethelp [command]url.purge dump.pool  3、通過Varnish管理埠,使用正則表示式批量清除快取:  (1)、例:清除類似http://blog.s135.com/a/zhangyan.html的URL地址):/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge /a/  (2)、例:清除類似http://blog.s135.com/tech的URL地址:/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge w*$  (3)、例:清除所有快取:/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge *$  4、一個清除Squid快取的PHP函式(清除Varnish快取同樣可以使用該函式,無需作任何修改,十分方便):
  1. <?php  
  2. function purge($ip$url)  
  3. {  
  4.     $errstr = '';  
  5.     $errno = '';  
  6.     $fp = fsockopen ($ip, 80, $errno$errstr, 2);  
  7.     if (!$fp)  
  8.     {  
  9.          return false;  
  10.     }  
  11.     else
  12.     {  
  13.         $out = "PURGE $url HTTP/1.1/r/n";  
  14.         $out .= "Host:blog.s135.com/r/n";  
  15.         $out .= "Connection: close/r/n/r/n";  
  16.         fputs ($fp$out);  
  17.         $out = fgets($fp , 4096);  
  18.         fclose ($fp);  
  19.         return true;  
  20.     }  
  21. }  
  22. purge("192.168.0.4""/index.php");  
  23. ?>  
[php] view plain copy print?
  1. <?php  
  2. function purge($ip$url)  
  3. {  
  4.     $errstr = '';  
  5.     $errno = '';  
  6.     $fp = fsockopen ($ip, 80, $errno$errstr, 2);  
  7.     if (!$fp)  
  8.     {  
  9.          return false;  
  10.     }  
  11.     else
  12.     {  
  13.         $out = "PURGE $url HTTP/1.1/r/n";  
  14.         $out .= "Host:blog.s135.com/r/n";  
  15.         $out .= "Connection: close/r/n/r/n";  
  16.         fputs ($fp$out);  
  17.         $out = fgets($fp , 4096);  
  18.         fclose ($fp);  
  19.         return true;  
  20.     }  
  21. }  
  22. purge("192.168.0.4""/index.php");  
  23. ?>  
<?phpfunction purge($ip, $url){    $errstr = '';    $errno = '';    $fp = fsockopen ($ip, 80, $errno, $errstr, 2);    if (!$fp)    {         return false;    }    else    {        $out = "PURGE $url HTTP/1.1/r/n";        $out .= "Host:blog.s135.com/r/n";        $out .= "Connection: close/r/n/r/n";        fputs ($fp, $out);        $out = fgets($fp , 4096);        fclose ($fp);        return true;    }}purge("192.168.0.4", "/index.php");?>  附1:Varnish官方網站:http://www.varnish-cache.org/  附2:2007年12月10日,我寫了一個每天0點執行,按天切割Varnish日誌,生成一個壓縮檔案,同時刪除上個月舊日誌的指令碼(/var/logs/cutlog.sh):  /var/logs/cutlog.sh檔案內容如下:引用#!/bin/sh# This file run at 00:00date=$(date -d "yesterday" +"%Y-%m-%d")pkill -9 varnishncsamv /var/logs/youvideo.log /var/logs/${date}.log/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/logs/youvideo.log &mkdir -p /var/logs/youvideo/gzip -c /var/logs/${date}.log > /var/logs/youvideo/${date}.log.gzrm -f /var/logs/${date}.logrm -f /var/logs/youvideo/$(date -d "-1 month" +"%Y-%m*").log.gz  設定在每天00:00定時執行:/usr/bin/crontab -e或者vi /var/spool/cron/root輸入以下內容:引用0 0 * * * /bin/sh /var/logs/cutlog.shTags:  linux , squid , varnish , cache