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