使用Varnish代替Squid做網站快取加速器的詳細解決方案 原創
阿新 • • 發佈:2018-12-20
[文章作者:張宴 本文版本: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快取同樣可以使用該函式,無需作任何修改,十分方便):
- <?php
- function 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");
- ?>
- <?php
- function 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");
- ?>