转贴自 : http://eportfolio.stut.edu.tw/~19690037/archives/1682
Varnish 是一款高性能且開源的反向網站快取伺服器(Reverse Proxy Server),挪威最大的線上報紙 Verdens Gang 使用3台Varnish代替了原本的12台Squid, 性能比以前更好。Varnish 的作者 Poul-Henning Kamp 是 FreeBSD 核心的開發人員之一,他認為現在的電腦比起1975年已經複雜許多。在那個時代,儲存媒介只有兩種:記憶體與硬碟。但現在電腦系統的記憶體除了主記憶體 外,還包括了CPU内的L1、L2,甚至有L3快取。硬碟上也有自己的快取裝置,因此squid cache自行處理物件替換的架構不可能得知這些情況而做到最佳化,但作業系統可以得知這些情況,所以這部份的耕作應該交給作業系統處理,這就是 Varnish Cache 的設計架構。
一般來說,使用Varnish代替Squid的理由有三點:
1、Varnish h採用了“Visual Page Cache”技術,在記憶體的利用上,Varnish 比 Squid 更具有優勢,它避免了Squid頻繁在記憶體、硬碟中交換文件,性能比 Squid 還高。
2、Varnish的穩定性高,進行相同工作的Squid伺服器發生故障的機率似乎比Varnish高。
3、透過Varnish管理端口,可以使用正規標達式快速、批量地清除部分快取,這一點是Squid不能具備的。
下面是我在 Linux 系統安裝配置 Varnish 的過程:
1、首先建立www用戶和群組,以及Varnish快取資料存放目錄:
sudo /usr/sbin/groupadd www -g 48
sudo /usr/sbin/useradd -u 48 -g www www
sudo mkdir -m 755 /var/vcache
sudo chown -R www:www /var/vcache
2、建立 Varnish 日誌檔目錄:
sudo mkdir -m 755 /var/log/vcache
sudo chown -R www:www /var/log/vcache
3、我是用apt下載安裝 Varnish:(也可以下載源碼自行編譯)
sudo apr-get install varnish
配置文件在/etc/varnish/vcl.conf
相關的執行檔在/usr/sbin和/usr/bin下
4、編輯配置文件 /etc/varnish/vcl.conf:
這裡我對這段配置文件說明一下:
(1) Varnish透過反向代理請求後端IP為192.168.0.13,端口為80的Web伺服器;
(2) Varnish允許localhost、127.0.0.1、192.168.0.***三個來源IP透過PURGE方法清除快取;
(3) Varnish對HTTP協議中的GET、HEAD請求進行快取,對POST請求通過,讓其直接訪問後端的Web伺服器。之所以這樣配置,是因為POST請求一般是發送資料給伺服器的,需要伺服器接收、處理,所以不需要快取;
(4) Varnish對以.txt和.js結尾的URL快取時間設置1小時,對其他的URL快取間設置為30天。
下面是我的範例配置文件:
backend default {
set backend.host = "192.168.0.13";
set backend.port = "http";
}
acl purge {
"localhost";
"127.0.0.1";
"192.168.0.1/24";
}
sub vcl_recv {
if (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed.";
lookup;
}
}
if (req.request != "GET" && req.request != "HEAD") {
pipe;
}
if (req.url ~ "/.(php|cgi)($|/?)") {
pass;
}
if (req.http.Expect) {
pipe;
}
if (req.http.Authenticate || req.http.Cookie) {
pass;
}
if (req.request == "GET" && req.url ~ "/.(gif|jpg|swf|css|js)$") {
lookup;
}
else {
lookup;
}
}
sub vcl_hit {
if (req.request == "PURGE") {
set obj.ttl = 0s;
error 200 "Purged.";
}
else if (!obj.cacheable) {
pass;
}
}
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;
}
}
5、用適當權限啟動 Varnish
ulimit -SHn 51200
/usr/sbin/varnishd -f /etc/varnish/vcl.conf -a 0.0.0.0:80 -s file,/var/vcache/varnish_cache.data,1024M -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on
6、配置開機自動啟動 Varnish
編輯啟動執行腳本/etc/rc.local並將上面內容貼到最下方,也可以寫成一個啟動腳本varnish.sh
7、啟動 varnishncsa,用來將Varnish訪問日誌寫入日誌文件:
/usr/bin/varnishncsa -r /var/vcache/varnish_cache.data -w /var/log/vcache/varnish.log &
8、優化Linux核心參數:
編輯/etc/sysctl.conf 在底部增加以下内容:
net.ipv4.tcp_fin_timeout = 30
#表示如果套接字由本端要求關閉,這個參數决定了它保持在FIN-WAIT-2狀態的時間。
net.ipv4.tcp_keepalive_time = 300
#表示當Keepalive起用的時候,TCP發送keepalive消息的頻繁度。預設值是2小時,這裡我改為5分鐘。
net.ipv4.tcp_syncookies = 1
#表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,預設為0,表示關閉,我將它開啟。
net.ipv4.tcp_tw_reuse = 1
#表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,預設為0,表示關閉,我將它開啟。
net.ipv4.tcp_tw_recycle = 1
#表示開啟TCP連接中TIME-WAIT sockets的快速回收,預設為0,表示關閉,我將它開啟。
net.ipv4.ip_local_port_range = 5000 65000
#表示用來向外連接的端口範圍。預設情况下很小:32768到61000,我將它改為5000到65000。
net.ipv4.tcp_max_syn_backlog = 8192
#表示SYN隊列的長度,預設為1024,加大隊列長度為8192,可容纳更多等待連接的網路連接數。
net.ipv4.tcp_max_tw_buckets = 5000
#表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除並印出警告訊息。預設是180000,改為5000。
之後記得執行 /sbin/sysctl -p 使配置生效。
接下來看看如何管理Varnish:
1、查看 Varnish 伺服器連接數與命中率:
/usr/bin/varnishstat
2、透過 Varnish 管理端口進行管理(用 --help查看可用的指令)
/usr/bin/varnishadm -T 127.0.0.1:3500 help
3、透過Varnish管理端口,使用正規表達式批量清除快取:
(1) 例如:清除類似http://www.example.com/a/abc.html的URL地址:
/usr/bin/varnishadm -T 127.0.0.1:3500 url.purge /a/
(2) 例如:清除類似http://www.example.com/tech的URL地址:
/usr/bin/varnishadm -T 127.0.0.1:3500 url.purge w*$
(3) 例如:清除所有快取:
/usr/bin/varnishadm -T 127.0.0.1:3500 url.purge *$
4、下面是一個每天0點執行,按天切割Varnish日誌,生成一個壓縮檔案,同時删除上個月舊日誌的腳本(/usr/local/bin/cutlog.sh):
#!/bin/sh
# This file run at 00:00
date=$(date -d "yesterday" +"%Y-%m-%d")
pkill -9 varnishncsa
mv /var/log/vcache/varnish.log /var/log/vcache/${date}.log
/usr/bin/varnishncsa -r /var/vcache/varnish_cache.data -w /var/log/vcache/varnish.log &
gzip -c /var/log/vcache/${date}.log > /var/log/vcache/${date}.log.gz
rm -f /var/log/vcache/${date}.log
rm -f /var/log/vcache/$(date -d "-1 month" +"%Y-%m*").log.gz
設定在每天早上00:00定時執行:
sudo /usr/bin/crontab -e
添加以下內容
0 0 * * * /usr/local/bin/cutlog.sh
5、如果你要確定varnish是否有正確執行,你可以用netstat -atp看有沒有一個正在監聽的3500通訊埠,或者用pa aux | grep varnishd看這個程序是否有在運作。
Varnish 官方網站:http://www.varnish-cache.org/
enjoy~!