若是有對以下的配置指令有不明晰的,附件有在下翻譯的VCL手冊,可以進行查閱!
1. 什麼是varnish?
1、varnish首先是一個反向代理伺服器,其次才是一個web加速緩存伺服器。它所緩存的對象是key/value(即鍵/值)的形式來存儲的,通常情況下,鍵一般是指URL,而值就是URL問的具體的資源(或稱為對象)。
2、varnish的配置檔案是由專門的VCL(即varnish 配置語言)來進行配置的。這種語言首先要先轉換為C代碼,然後在執行。
3、varnish支援epoll、kqueue等這種高性能的I/O事件通知模型。
4、 varnish的日志在它所申請的共享記憶體日志中。預設為80M,
2. varnish的原理
1、varnish啟動後包含兩個程序,一個是management程序和child程序。
2、management程序主要用來管理配置檔案以及對子程序的監控和對varnish的初始化,而且提供了一個指令行管理接口等。
3、child程序由幾個不同類型的線程組成,比較典型的有:
● acceptor線程:用來接收新連接配接
● worker線程:具體工作的線程,一個線程對應一個連接配接會話。
● expiry線程:對過期的線程程序清除。
3. varnish支援的緩存存儲類型:
● file:使用特定的檔案存儲所有的緩存資料,然後在通過mmap()這個系統調用将整個檔案的資料映射到程序空間。不過,重新開機或停止varnish後,緩存的内容會消失,也就是說不能持久存儲。
● malloc:使用malloc()系統調用在varnish啟動的時候想記憶體申請固定大小的記憶體來緩存資料。
● persistent:還處于測試時期,不建議使用。
注:存儲類型使用-s參數來指定。
4. 安裝與配置
環境:CentOS6.5,iptables 和 selinux 為關閉狀态。
軟體包:varnish-3.0.5-1.el6.x86_64.rpm
varnish-docs-3.0.5-1.el6.x86_64.rpm
varnish-libs-3.0.5-1.el6.x86_64.rpm
下載下傳位址:
http://repo.varnish-cache.org/redhat/varnish-3.0/el6/x86_64/varnish/
前端:varnish伺服器,兩塊網卡:
eth0: 172.16.0.11
eth1: 192.168.0.11
後端:兩台apache伺服器,各一塊網卡:
web1: 192.168.0.12
web2: 192.168.0.13
網關:192.168.0.11
配置檔案:
目錄:/etc/varnish
檔案:default.vcl
secret #用于管理接口所使用的共享密鑰檔案
腳本:/etc/rc.d/init.d/varnishd
腳本配置檔案:/etc/sysconfig/varnish #用于指定配置參數
其中:-a <[hostname]:port> : 指定varnish服務監聽的位址和端口
-f <filename> : 指定VCL檔案路徑
-p <parameter=value> : 用于調整參數值
-S <secretfile> : 指令行管理接口的認證加密檔案
-T <hostname:port> : 指定管理的位址和接口
-s <storagetype,options> : 指定緩存對象的存儲類型和位置,以及大小等
負載均衡支援的算法:
● round-robin : 沒有額外的參數
● random :包含有兩個參數:
1、.weight :表示權重越大,對應的後端伺服器接收的請求越多,可以對每個後端伺服器進行設定。
2、.retries : 用于定義查找後端健康伺服器的次數。是對整個director進行設定的,其預設值為在director中定義的伺服器的數量。
● hash :它是random的一個特殊變體,它使用緩存中的hash資料來進行排程,也就是說相同的URL的請求将會發往相同的web伺服器。這種排程方法非常适合後端伺服器還是緩存伺服器的情況。
● client :它也是random的一個特殊變體。它使用client.identity來進行排程,此變量預設值是用戶端的IP,但是可以在VCL中改變其值。使用這種算法,如果所有 請求的client.identity的值相同的話,那麼統一用戶端的請求都會發往同一個後端伺服器。
● dns :它是根據用戶端請求Host頭部資訊,在一個給定的後端伺服器清單中進行查找 比對的。(此算法用的不多,也不支援對後端服務的健康檢測)
● fallback : 用來定義備用伺服器,沒有額外的參數。
注意:先定義後調用,有先後順序之分,隻定義不調用會報錯。比如,在定義director後必須在後面對其進行調用否則會發生編譯錯誤。
1、将varnish的監聽接口改為80
vim /etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80
2、定義後端伺服器
backend web1 {
.host = "192.168.0.12";
.port = "80";
}
backend web2 {
.host = "192.168.0.13";
3、定義負載均衡director(即排程器)
director webs round-robbin {
{ .backend = web1; }
{ .backend = web2; }
4、調用上面定義的director
sub vcl_recv {
set req.backend = webs;
return(pass); #測試的時候把預設配置的return(lookup)改為return(pass),否 則,後續的請求就直接去查找緩存了,看不出測試效果。
5、定義對後端進行健康狀态的檢測,需要在backend區段的上面,并在backend區段進行引用
probe healthchk {
.url = "/";
.interval = 3s;
.timeout = 10ms
.window = 3;
.threshold = 2;
.initial = 3;
.expected_response = 200;
.probe = healthchk;
.probe = hearlthchk;
6、定義動靜分離,假定web1提供動态内容,web2提供靜态記憶體,不過要先把director端注釋掉
if (req.url ~ "(?i)\.php$") {
set req.backend = web1;
} else {
set req.backend = web2;
}
sub vcl_fetch {
set beresp.http.From-Backend = beresp.backend.ip; #用于測試是否動靜個來自對應的伺服器
7、定義反盜鍊功能
if (req.http.referer ~ "http://.*") {
if ( !(req.http.referer ~ "http://.*\.google\.com" ||
req.http.referer ~ "http://.*\.baidu\.com" ||
req.http.referer ~ "http://.*\.myselfsite\.com"))
{
set req.http.host = "www.myselfsite.com";
set req.url = "/login/login.html";
}
8、如何知道緩存是否命中,以及命中的次數
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Varnish-Cache = "HIT";
set resp.http.X-Cache-Hits = obj.hits;
set resp.http.X-Varnish-Cache = "MISS";
9、去掉對靜态檔案請求時所帶的Cookie資訊,可以提供緩存命中率
if (req.url ~ "(?i)\.(html|htm|jpg|gif|ico|jpeg|png|js|css|swf)(\?[a-z0-9]+)?$") {
unset req.http.Cookie;
unset beres.backend.set-cookie;
10、手動清除過期的緩存
acl purgers {
"127.0.0.1";
"192.168.0.0"/24;
if (req.request == "PURGE") {
if (!client.ip ~ purgers) {
error 405 "Method not allowed";
}
return (lookup);
sub vcl_hit {
purge;
error 200 "Purged";
sub vcl_miss {
error 404 "Not in cache";
sub vcl_pass {
error 502 "PURGE on a passed object";