摘 要:Drupal是使用PHP語言編寫的開源內容管理框架(CMF),它由內容管理系統(CMS)和PHP開發框架(Framework)共同構成。而Varnish是一款優秀的反向代理服務器,本文就Varnish的基本使用方法配合Drupal網站做出了詳細的闡述分析。
關鍵詞:varnish;VCL;grace mode;saint mode
中圖分類號:TP311.52 文獻標識碼:A
1 引言
網站實現以Drupal為框架開發是一個較好的選擇,若要實現高負載Varnish是一個不錯的選擇,通過其部署相關運行環境,才能使得網站運營更加正常高效。
2 Varnish基本結構
/etc/varnish/ 存放varnish VCL配置文件
/etc/sysconfig/varnish 【CentOS】 存放varnish服務器運行的參數
/etc/default/varnish 【Ubuntu】 存放varnish服務器運行的參數
/usr/sbin/varnishd varnish服務器執行文件
/etc/init.d/varnish 運行程序
3 Varnish的相關命令
本文用到了以下幾個主要的varnish管理命令[1]。
varnishadm 管理Varnish后端的工具 telnet。
varnishhist 查看Varnish命中的工具 運行可以看到一張柱狀描繪圖,|表示緩存命中,#表示未命中,橫向代表時間。
varnishlog 實時顯示varnish的請求日志。
varnishncsa 以Apache標準的格式combined輸出日志。
varnishstat 查看狀態、參數等。
varnishtop 類似top工具,查看varnish相關進程的資源、運行等狀況。
varnishncsa 將Varnish的log以Apache的格式輸出,varnishlog以原始方式顯示Varnish的日志。
管理varnish以及清除內存等操作雖然可以使用varnishadm,但是本文使用telnet,一個交互的管理界面。
示例: telnet 127.0.0.1 6082之后,輸入help會顯示所有可用命令。
help [command]
ping [timestamp]
status
start
stop
stats
vcl.load
vcl.inline
vcl.use
vcl.discard
vcl.list
vcl.show
param.show [-l] []
param.set
quit
purge.url
purge.hash
purge [ ]...
purge.list
重新加載Varnish配置文件
telnet 127.0.0.1 6082
vcl.load newconfig /data/app/varnish/etc/varnish/default.vcl
vcl.use newconfig
注意:varnish 的CLI可能需要認證,最簡單的辦法就是在varnish啟動的時候取掉相應的參數。
4 Varnish的緩存方式
Malloc (malloc) 通過malloc獲取內存,簡單,速度快。
Mmap file (file) 創建文件緩存。
這是varnish緩存的兩種方式,可以在啟動的時候通過參數指定。
5 Varnish處理流程
首次請求時過程如下[2]:
recv->hash->miss->fetch->deliver
緩存后再次請求:
recv->hash->hit->deliver;fetch的過程沒了,這就是我們要做的,把要緩存的頁面保存下來。
直接交給后端pass的情況:
recv->hash->pass->fetch->deliver;直接從后端獲取數據后發送給客戶端,此時Varnish相當于一個中轉站,只負責轉發。
6 Varnish負載均衡
通過把多臺backends聚合成一個組,這些組被叫做directors。這樣可以增強性能和彈力[3]。本文定義多個backends和多個group在同一個directors。
backend server1 {
.host = \"192.168.0.1\" ;
.port = \"8080\" ;
}
backend server2 {
.host = \"192.168.0.2\" ;
.port = \"8080\" ;
}
director drupal001 round-robin {
{ .backend = server1; }
{ .backend = server2; }
}
sub vcl_recv {
if (req.http.host !~ \"www\.drupal001\.com$\"){
error 404 \"Unknown HostName!\";
}
set req.backend = drupal001;
}
在之前的兩個后端服務器上加上健康檢查。
backend server1 {
.host = \"192.168.0.1\" ;
.port = \"8000\" ;
.probe = {
.url = \"/\"; #哪個 url需要varnish請求。
.interval = 5s; #檢查的間隔時間。
.timeout = 1 s; #等待多長時間探針超時。
.window = 5; #維持5個sliding window的結果。
.threshold = 3; #至少有三次window是成功的,就宣告bachend健康。
}
}
7 VCL以及基本對象
request 從客戶端進來。
responses 從后端服務器過來。
object 存儲在cache中。
8 VCL使用語言
req 請求目標,當varnish接收到一個請求,這時req object就被創建了,你在vcl_recv中的大部分工作,都是在req object上展開的。
beresp 后端服務器返回的目標,它包含返回的頭信息,你在vcl_fetch中的大部分工作都是在beresp object上開展的。
obj 被cache的目標,只讀的目標被保存于內存中,obj.ttl的值可修改,其他的只能讀[4]。
9 Grace mode
如果后端需要很長時間來生成一個對象,這里有一個線程堆積的風險。為了避免這種情況使用Grace。當同時有多個請求過來的時候,varnish只發送一個請求到后端服務器,在“set beresp.grace = 30m; ”時間內復制舊的請求結果給客戶端。
10 Saint mode
需要通知varnish使用更加優雅的方式處理它,這種方式叫神圣模式(saint mode)。Saint mode允許拋棄一個后端服務器或者另一個嘗試的后端服務器或者cache中服務陳舊的內容。
sub vcl_fetch {
if (beresp.status == 500) {
set beresp.saintmode = 10s;
restart;
}
set beresp.grace = 5m;
}
Varnish代理
########
backend default {
.host = \"192.168.0.12\";
.port = \"8080\";
}
#現在添加一個新的backend服務器
backend test {
.host = \"192.168.0.12\";
.port = \"8000\";
}
#要定義特殊的url被發送到哪里
sub vcl_recv {
if (req.url ~ \"^/abcd/\") {
set req.backend = test;
} else {
set req.backend = default;
}
}
11 注意事項
(1) Varnish的不同版本的配置不同。
比如,在2.x 直接用ESI表示啟用ESI,在3.x就不是了。
(2) Varnish 2.x有Cookie的問題,當Cookie過大,會產生503錯誤,升級varnish或者減少set_cookie的操作。
(3) 啟動varnishd的時候如果選用-s file方式,每次會重新建立緩存文件,而原來的文件不會刪除,因此注意清除這些遺留文件。
12 總結
至此,通過Varnish基本的布置,配合Drupal模塊模式不難構建出一個高性能的網站。
參考文獻
[1] 彭輝.Varnish的研究與實現[J].計算機光盤與軟件,2012,2(3):22-23.
[2] 楊志成.基于Drupal協議的研究與實現[J].計算機工程與應用,2013,1(4):15-16.
[3] 吳偉易.Varnish關鍵技術的研究以及網站的實現[J].電腦知識與技術,2012,4(2):26-27.
[4] 林建勝.Drupal網站模式的研究與實現[J].計算機軟件與發展.2012,3(2):34-36.
作者簡介:
陳 浩(1979-),男,碩士,講師,實驗師.研究領域:計算機網絡技術的研究與應用.