目的:一台服務器既跑varnish,又跑系統自帶的apache,當然端口肯定不一樣,要測試確定varnish緩存了apache?
環境:RedHat4.8(64位)
IP地址:192.168.5.55
varnish版本:2.1.2
1、下載varnish並安裝,我這裡就不安裝pcre庫了,因為我系統安裝時所有的包都安裝完畢。另外可以到http://varnish-cache.org下載不同的版本,我個人還是建議下載和我一樣的版本,因為1版本和2版本之間的配置文件格式不太一樣,不然N多人又犯頭疼了!
tar -zxvf varnish-2.1.2.tar.gz
cd varnish-2.1.2
./configure --prefix=/usr/local/varnish --enable-dependency-tracking --enable-debugging-symbols --enable-developer-warnings
如果提示找不到no package 'libpcre' found,那麼你需要指定pcre庫的路徑,其實很簡單,你指定你的pcre庫的正確路徑就OK了,我這默認是在/usr/lib目錄下,你的如果是之後源碼安裝的,那麼在你安裝目錄下的lib目錄下,比如你安裝在/usr/local/pcre,那麼庫文件就是/usr/local/pcre/lib/pkgconfig。執行如下命令 :
export PKG_CONFIG_PATH=你的pcre庫的路徑
make
make install
2、基本配置varnish,我先不管裡面的一些函數使用說明介紹了,如果要看的話請看權威指南,默認的varnish的配置文件全是注釋在/usr/local/varnish/etc/varnish/目錄下,這裡我備份一下配置文件,然後新建一個default.vcl文件,內容如下:
##通過backend定義一個名稱為webserver的後端主機,".host"指定後端主機的IP地址或者域名,".port"指定後端主機的端口,這裡也可以定義多台後端服務器,起到輔助分擔和健康檢測機制。
backend webserver {
.host = "192.168.5.55";
.port = "9999";
}
##開始調用vcl_recv
sub vcl_recv {
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For =
req.http.X-Forwarded-For ", " client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
##如果請求的類型不是GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE,則進入
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
return (pipe);
}
##如果請求的類型不是GET或HEAD,則進入pass模式
if (req.request != "GET" && req.request != "HEAD") {
return (pass);
}
##對zzz.com域名進行緩存加速,後端的服務器apache就是對應的域名www.zzz.com。這個是泛域名的概念
if (req.http.host ~ "^(.*).zzz.com") {
set req.backend = webserver;
}
}
sub vcl_pipe {
return (pipe);
}
sub vcl_pass {
return (pass);
}
sub vcl_hash {
set req.hash += req.url;
if (req.http.host) {
set req.hash += req.http.host;
} else {
set req.hash += server.ip;
}
return (hash);
}
sub vcl_hit {
if (!obj.cacheable) {
return (pass);
}
return (deliver);
}
sub vcl_miss {
return (fetch);
}
sub vcl_fetch {
if (!beresp.cacheable) {
return (pass);
}
if (beresp.http.Set-Cookie) {
return (pass);
}
}
下面添加一個Header標識,以判斷緩存是否命中
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from www.zzz.com";
} else {
set resp.http.X-Cache = "MISS from www.zzz.com";
}
return (deliver);
}
這就是一個簡單的實例,如果有別的需求請參考別的文檔!
3、啟動varnish
/usr/local/varnish/sbin/varnishd -f /usr/local/varnish/etc/varnish/default.vcl -s malloc,128m -T 127.0.0.1:200 -a 0.0.0.0:9000
-f是指定配置文件
-s是一種存儲類型和存儲容量,使用的是malloc類型(malloc是一個c函數,用於分配內容空間),128定義多少內存被malloced。
-T是varnish基於文本的管理接口
-a是指定varnish監聽所有IP發給9000端口的http請求。
查看varnish進程
root 13635 1 0 16:33 ? 00:00:00 /usr/local/varnish/sbin/varnishd -f /usr/local/varnish/etc/varnish/default.vcl -s malloc,128m -T 127.0.0.1:200 -a 0.0.0.0:9000
nobody 13636 13635 0 16:33 ? 00:00:00 /usr/local/varnish/sbin/varnishd -f /usr/local/varnish/etc/varnish/default.vcl -s malloc,128m -T 127.0.0.1:200 -a 0.0.0.0:9000
查看200端口和9000端口,200是管理端口,9000是代理端口。
netstat -an | grep 9000
tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN
netstat -an | grep 200
tcp 0 0 127.0.0.1:200 0.0.0.0:* LISTEN
4、啟動系統自帶的apache,配置文件基本沒變動,端口改為9999而已。另外在/var/www/html目錄下新建一個index.html測試頁,隨便寫點什麼內容!最後啟動apache服務
/etc/init.d/httpd start
在本機hosts文件加上映射關系
192.168.5.55 www.zzz.com
5、現在應該看到varnish和apache的url是一個網頁,但是不知道是代理還是緩存?
curl http://www.zzz.com:9000 抓取varnish的頁面
hello!!!
curl http://www.zzz.com:9999 抓取apache的頁面
hello!!!
6、varnish配置文件在最後一行加入了Header信息,所有直接抓取報頭就知道緩存是否成功?
curl -I http://www.zzz.com:9000
HTTP/1.1 200 OK
Server: Apache/2.0.52 (Red Hat)
Last-Modified: Mon, 15 Oct 2012 07:07:27 GMT
ETag: "1bc893-9-4cc13b0a6a9c0"
Content-Type: text/html; charset=UTF-8
Content-Length: 9
Date: Tue, 13 Nov 2012 08:45:45 GMT
X-Varnish: 337763601
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: MISS from www.zzz.com 這裡的MISS表示此次訪問沒有從緩存讀取
再次打開這個頁面,查看網頁的頭信息。
curl -I http://www.zzz.com:9000
HTTP/1.1 200 OK
Server: Apache/2.0.52 (Red Hat)
Last-Modified: Mon, 15 Oct 2012 07:07:27 GMT
ETag: "1bc893-9-4cc13b0a6a9c0"
Content-Type: text/html; charset=UTF-8
Content-Length: 9
Date: Tue, 13 Nov 2012 08:45:47 GMT
X-Varnish: 337763602 337763601
Age: 1
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT from www.zzz.com 這裡的HIT表示此次訪問從緩存讀取,也就是緩存命中
7、配置一下緩存時間吧!我在varnish的配置文件裡面配置沒有生效,不知道為什麼?QQ一哥們說一般都是在後端服務器配置緩存時間,所以這個問題暫不糾結了,另外再說一下varnish如果不配置緩存時間,默認是兩分鐘,也就是120秒。不信可以拿一個腳本測試一下!打開apache的配置文件httpd.conf,在最後面加上如下內容:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/gif A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/png A2592000
ExpiresByType image/x-icon A2592000
ExpiresByType appli
cation/x-javascript A604800
ExpiresByType text/css A604800
ExpiresByType text/html A125 其實我測試暫時只有這一行起到作用,別的可加可不加,時間是125秒
</IfModule>
8、重啟apache服務
/etc/init.d/httpd restart
9、測試看看緩存有沒有生效?
curl -I http://www.zzz.com:9000
HTTP/1.1 200 OK
Server: Apache/2.0.52 (Red Hat)
Last-Modified: Mon, 15 Oct 2012 07:07:27 GMT
ETag: "1bc893-9-4cc13b0a6a9c0"
Cache-Control: max-age=125 這裡表示緩存時間
Expires: Tue, 13 Nov 2012 09:14:28 GMT 這裡表示緩存過期時間,需要加8小時算
Content-Type: text/html; charset=UTF-8
Content-Length: 9
Date: Tue, 13 Nov 2012 09:12:23 GMT
X-Varnish: 337763610
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: MISS from www.zzz.com
說明生效了!
10、查看varnish系統緩存的狀態
/usr/local/varnish/bin/varnishstat
0+00:44:05 nagios-server
Hitrate ratio: 1 1 1
Hitrate avg: 0.4545 0.4545 0.4545
11 0.00 0.00 Client connections accepted
11 0.00 0.00 Client requests received
5 0.00 0.00 Cache hits
6 0.00 0.00 Cache misses
6 0.00 0.00 Backend conn. success
6 0.00 0.00 Fetch with Length
10 . . N struct sess_mem
1 . . N struct objectcore
1 . . N struct objecthead
10 . . N worker threads
10 0.00 0.00 N worker threads created
1 . . N backends
6 . . N expired objects
1 . . N LRU moved objects
1 0.00 0.00 Objects sent with write
11 0.00 0.00 Total Sessions
11 0.00 0.00 Total Requests
6 0.00 0.00 Total fetch
4223 0.00 1.60 Total header bytes
9 0.00 0.00 Total body bytes
11 0.00 0.00 Session Closed
11 0.00 0.00 Session Linger
2427 2.00 0.92 SHM records
1850 2.00 0.70 SHM writes
12 0.00 0.00 SMA allocator requests
5126 . . SMA bytes allocated
5126 . . SMA bytes free
6 0.00 0.00 Backend requests made
1 0.00 0.00 N vcl total
1 0.00 0.00 N vcl available
1 . . N total active purges
2 0.00 0.00 N new purges added
1 0.00 0.00 N old purges deleted
11 0.00 0.00 HCB Lookups without lock
6 0.00 0.00 HCB Lookups with lock
6 0.00 0.00 HCB Inserts
2645 1.00 1.00 Client uptime
以上各字段不解釋了,參考權威指南吧!
11、管理緩存內容,清除緩存內容的命令格式
/usr/local/varnish/bin/varnishadm -T 127.0.0.1:200 puger.url <regexp>
列出最近清除的url列表的命令如下:
/usr/local/varnish/bin/varnishadm -T 127.0.0.1:200 purge.list
清除所有的緩存
/usr/local/varnish/bin/varnishadm -T 127.0.0.1:200 purge.url ^.*$
另外還可以通過管理端口來清除緩存頁面!