一、varinish簡介
Varnish是一款高性能的開源HTTP加速器,他的作者Poul-Henning Kamp是FreeBSD的內(nèi)核開發(fā)者之一。挪威最大的在線報(bào)紙 Verdens Gang 使用3臺Varnish代替了原來的12臺Squid,性能比以前更好。
Varnish與一般服務(wù)器軟件類似,就是一個(gè)web緩存代理服務(wù)器,分為master(management)進(jìn)程和child(worker,主要做cache的工作)進(jìn)程。master進(jìn)程讀入命令,進(jìn)行一些初始化,然后fork并監(jiān)控child進(jìn)程。child進(jìn)程分配若干線程進(jìn)行工作,主要包括一些管理線程和很多woker線程。
Management進(jìn)程主要實(shí)現(xiàn)應(yīng)用新的配置、編譯VCL、監(jiān)控varnish、初始化varnish以及提供一個(gè)命令行接口等。 Management進(jìn)程會(huì)每隔幾秒鐘探測一下Child進(jìn)程以判斷其是否正常運(yùn)行,如果在指定的時(shí)長內(nèi)未得到Child進(jìn)程的回 應(yīng),Management將會(huì)重啟此Child進(jìn)程。
Child進(jìn)程包含多種類型的線程,常見的如:
Acceptor線程:接收新的連接請求并響應(yīng);
Worker線程:child進(jìn)程會(huì)為每個(gè)會(huì)話啟動(dòng)一個(gè)worker線程,因此,在高并發(fā)的場景中可能會(huì)出現(xiàn)數(shù)百個(gè)worker線程甚至更多;
Expiry線程:從緩存中清理過期內(nèi)容;
Varnish依賴“工作區(qū)(workspace)”以降低線程在申請或修改內(nèi)存時(shí)出現(xiàn)競爭的可能性。在varnish內(nèi)部有多種不同的工作區(qū),其中最關(guān)鍵的當(dāng)屬用于管理會(huì)話數(shù)據(jù)的session工作區(qū)。
二、VCL簡介
Varnish Configuration Language (VCL)是varnish配置緩存策略的工具,它是一種基于“域”(domain specific)的簡單編程語言,它支持有限的算術(shù)運(yùn)算和邏輯運(yùn)算操作、允許使用正則表達(dá)式進(jìn)行字符串匹配、允許用戶使用set自定義變量、支持if判 斷語句,也有內(nèi)置的函數(shù)和變量等。使用VCL編寫的緩存策略通常保存至.vcl文件中,其需要編譯成二進(jìn)制的格式后才能由varnish調(diào)用。
VCL處理過程大致分為如下幾個(gè)步驟:
(1)Receive 狀態(tài),也就是請求處理的入口狀態(tài),根據(jù) VCL 規(guī)則判斷該請求應(yīng)該是 Pass 或
Pipe,或者進(jìn)入 Lookup(本地查詢)。
(2)Lookup 狀態(tài),進(jìn)入此狀態(tài)后,會(huì)在 hash 表中查找數(shù)據(jù),若找到,則進(jìn)入 Hit 狀態(tài),否則進(jìn)
入 miss 狀態(tài)。
(3)Pass 狀態(tài),在此狀態(tài)下,會(huì)進(jìn)入后端請求,即進(jìn)入 fetch 狀態(tài)。
(4)Fetch 狀態(tài),在 Fetch 狀態(tài)下,對請求進(jìn)行后端的獲取,發(fā)送請求,獲得數(shù)據(jù),并進(jìn)行本地
的存儲。
(5)Deliver 狀態(tài), 將獲取到的數(shù)據(jù)發(fā)送給客戶端,然后完成本次請求。
三、varnish的安裝
1、server1中:
1.安裝varnish
yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y
2.更改varnish全局配置
vim /etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80 #更改varnish服務(wù)端口為80
3.更改varnish配置文件
vim /etc/varnish/default.vcl
backend default { #配置一個(gè)后端服務(wù)器
.host = "172.25.4.2"; #更改訪問IP為172.25.4.2
.port = "80";
}
4.重新加載服務(wù)
/etc/init.d/varnish reload
2、server2中:
1.安裝apache
yum install httpd -y
/etc/init.d/httpd start
2.制作index.html
cd /var/www/html
vim index.html
server2
3.重新加載服務(wù)
/etc/init.d/httpd reload
3、測試:
物理機(jī)中打開firefox,訪問172.25.4.1,看到server2即配置成功
四、測試緩存命中情況
1、server1中:
1.更改配置文件
vim /etc/varnish/default.vcl
添加
sub vcl_deliver { #查看緩存命中情況
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";
}
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}
2.重新加載服務(wù)
/etc/init.d/varnish reload
2、測試:
物理機(jī)中:
curl -I 172.25.4.1 第一次顯示 MISS from westos cache 緩存中沒有,前往后端獲取
curl -I 172.25.4.1 第二次顯示 HIT from westos cache 緩存中直接獲取
3、通過 varnishadm 手動(dòng)清除緩存
varnishadm ban.url .*$ #清除所有緩存
varnishadm ban.url /index.html #清除 index.html 頁面緩存
varnishadm ban.url /admin/$ #清除 admin 目錄緩存
測試:
1.測試清除所有緩存
物理機(jī)中curl -I 172.25.4.1兩次,使172.25.4.1緩存到cache中
server1中執(zhí)行 varnishadm ban.url .*$ 清除所有緩存
物理機(jī)中curl -I 172.25.4.1 ,發(fā)現(xiàn)顯示MISS from westos cache
2.測試清除 index.html 頁面緩存
物理機(jī)中curl -I 172.25.4.1/index.html兩次,使172.25.4.1/index.html緩存到cache中
server1中執(zhí)行 varnishadm ban.url /index.html 清除 index.html 頁面緩存
物理機(jī)中curl -I 172.25.4.1/index.html 發(fā)現(xiàn)顯示MISS from westos cache
注意:
此時(shí)如果cache中有172.25.4.1的緩存信息,使用curl -I 172.25.4.1訪問時(shí)會(huì)顯示HIT from westos cache,這是因?yàn)殡m然curl -I 172.25.4.1
和curl -I 172.25.4.1/index.html訪問得到的結(jié)果一致,但是緩存到cache中的地址不同。cache緩存的是用戶訪問的url
拓展:
curl -I 172.25.4.1訪問的結(jié)果中Age表示緩存時(shí)間,默認(rèn)為120s后自動(dòng)清除,可在/etc/sysconfig/varnish中修改
五、定義多個(gè)不同域名站點(diǎn)的后端服務(wù)器
1、server3中:
1.安裝acpache
yum install httpd -y
/etc/init.d/httpd start
2.制作index.html
cd /var/www/html
vim index.html
www.linux.org
3.重新加載服務(wù)
/etc/init.d/httpd reload
2、server2中:
1.更改index.html
cd /var/www/html
vim index.html
www.westos.org
2.重新加載服務(wù)
/etc/init.d/httpd reload
3、物理機(jī)中:
1.添加本地解析
vim /etc/hosts
172.25.4.1 www.westos.org www.linux.org westos.org
4、server1中:
1.更改配置文件
vim /etc/varnish/default.vcl
backend web1 {
.host = "172.25.4.2";
.port = "80";
}
backend web2 {
.host = "172.25.4.3";
.port = "80";
}
#當(dāng)訪問 westos.org 域名時(shí),自動(dòng)訪問 www.westos.org 域名
#當(dāng)訪問 www.westos.org 域名時(shí)從 web1 上取數(shù)據(jù),訪問 www.linux.org 域名時(shí)到 web2 取數(shù)據(jù),訪問其他頁面報(bào)錯(cuò)
sub vcl_recv {
if (req.http.host ~ "^(www.)westos.org") {
set req.http.host = "www.westos.org";
set req.backend = web1;
} elsif (req.http.host ~ "^www.linux.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}
2.重新加載服務(wù)
/etc/init.d/varnish reload
5、測試:
物理機(jī)中:
curl www.westos.org
curl westos.org
發(fā)現(xiàn)兩者得到的結(jié)果相同,均為server2中相應(yīng)的index.html文件內(nèi)容
curl www.linux.org
得到server3中相應(yīng)的index.html文件內(nèi)容
六、定義負(fù)載均衡
1、server3中:
1.更改apache配置文件
vim /etc/httpd/conf/httpd.conf
打開
NameVirtualHost *:80
添加
DocumentRoot /var/www/html
ServerName www.linux.org
DocumentRoot /www1
ServerName www.westos.org
2.建立/www1/index.html
mkdir /www1
vim /www1/index.html
www.westos.org-server3
3.重新加載服務(wù)
/etc/init.d/httpd reload
4.配置本地解析
vim /etc/hosts
172.25.4.3 server3 www.westos.org www.linux.org
5.測試配置是否生效
curl www.linux.org
curl www.westos.org
得到相應(yīng)的index.html文件中的內(nèi)容
2、server1中:
1.更改varnish配置
vim /etc/varnish/default.vcl
#把多個(gè)后端聚合為一個(gè)組,并檢測后端健康狀況
director lb round-robin {
{ .backend = web1; }
{ .backend = web2; }
}
sub vcl_recv {
if (req.http.host ~ "^(www.)westos.org") {
set req.http.host = "www.westos.org";
set req.backend = lb;
} elsif (req.http.host ~ "^www.linux.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}
2.重新加載配置
/etc/init.d/varnish reload
3、測試:
1.物理機(jī)中:
curl www.westos.org 得到server2中相應(yīng)的index.html文件內(nèi)容
2.server1中:
varnishadm ban.url .*$ 清除所有緩存
3.物理機(jī)中:
curl www.westos.org 得到server3中相應(yīng)的index.html文件內(nèi)容
注意:
還可以更改server1中varnish配置文件,添加return (pass); 使得varnish緩存功能失效,客戶端直接去后端抓取內(nèi)容,可以獲得更好的
測試對比效果
4、server1中:
1.更改varnish配置
vim /etc/varnish/default.vcl
sub vcl_recv {
if (req.http.host ~ "^(www.)westos.org") {
set req.http.host = "www.westos.org";
set req.backend = lb;
return (pass); #varnish緩存功能失效,客戶端直接去后端抓取內(nèi)容
} elsif (req.http.host ~ "^www.linux.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}
2.重新加載配置
/etc/init.d/varnish reload
5、測試:
物理機(jī)中:
curl www.westos.org
curl www.westos.org
curl www.westos.org
curl www.westos.org
發(fā)現(xiàn)循環(huán)得到server2和server3相應(yīng)的index.html內(nèi)容
此時(shí)若server2的httpd服務(wù)關(guān)閉curl會(huì)一直讀取server3相應(yīng)的index.html內(nèi)容而不會(huì)報(bào)錯(cuò),這是因?yàn)関arnish擁有自動(dòng)的健康檢查功能,
若開啟server2的httpd服務(wù),使用curl又能夠循環(huán)讀取到server2和server3相應(yīng)的index.html內(nèi)容
server2中:
/etc/init.d/httpd stop
物理機(jī)中:
curl www.westos.org
curl www.westos.org
發(fā)現(xiàn)一直得到server3相應(yīng)的index.html內(nèi)容
server2中:
/etc/init.d/httpd start
物理機(jī)中:
curl www.westos.org
curl www.westos.org
curl www.westos.org
curl www.westos.org
發(fā)現(xiàn)循環(huán)得到server2和server3相應(yīng)的index.html內(nèi)容
七、varnish全局配置文件中的參數(shù)
1、NFILES #所能夠打開的最大文件數(shù)
server1中:
1.查看內(nèi)核允許的打開文件數(shù)的最大值
sysctl -a | grep file
2.更改varnish配置文件
vim /etc/sysconfig/varnish
更改NFILES數(shù)值,小于內(nèi)核允許最大值
NFILES=66655
3.更改系統(tǒng)限制文件
vim /etc/security/limits.conf
varnish nofile 66656
2、MEMLOCK #用多大內(nèi)存空間保存日志信息
server1中:
1.更改varnish用戶為可交互登陸模式,切換到varnish用戶
usermod -s /bin/bash varnish
su – varnish
2.查看系統(tǒng)允許的最大值
ulimit -l
*拓展:
ulimit -a #查看所有系統(tǒng)限制
3.更改系統(tǒng)限制文件
logout
vim /etc/security/limits.conf
varnish memlock 82000
3、NPROCS #進(jìn)程核心轉(zhuǎn)儲所使用的內(nèi)存空間,unlimited表示無上限
server1中:
1.切換到varnish用戶
su – varnish
2.查看系統(tǒng)允許的最大值
ulimit -u
3.更改系統(tǒng)限制文件
logout
vim /etc/security/limits.conf
varnish nproc unlimited
4.還原varnish用戶登陸設(shè)置
usermod -s /sbin/nologin varnish
注意:/etc/security/limits.conf 與 /etc/sysconfig/varnish 配置文件均是即改即生效
拓展:
VARNISH_TTL=120 #聯(lián)系后端服務(wù)器的超時(shí)時(shí)間
VARNISH_STORAGE_SIZE=1G #儲存的文件的大小
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin #基于文件存儲時(shí)的文件路徑
varnish與squid的區(qū)別
varnish和squid在中小規(guī)模的應(yīng)用上,varnish足夠輕量級,足夠好用,但是在巨大的并發(fā)請求來說,單個(gè)varnish所能夠承載的并發(fā) 訪問量大概在5000個(gè)連接請求左右,超出5000個(gè)可能就就得不穩(wěn)定了;而在這里squid就能表現(xiàn)出良好的性能了,并且squid擁有鄰居功能,因此在大規(guī)模的企業(yè)級應(yīng)用中仍然是以squid居多,而在中小規(guī)模的自己公司的反向代理緩存中varnish居多
8、CDN推送平臺
1、server1:
1.安裝apache服務(wù)
yum install httpd -y
2.更改apache服務(wù)配置
避免與varnish服務(wù)端口沖突
vim /etc/httpd/conf/httpd.conf
Listen 8080
3.下載bansys.zip包,安裝解壓縮命令
yum install unzip -y
unzip bansys.zip -d /var/www/html
4.將解壓出來的目錄中的文件移動(dòng)至/var/www/html
cd /var/www/html
cd bansys/
mv * ..
5.安裝php服務(wù)
yum install php -y
6.開啟apache服務(wù)
/etc/init.d/httpd start
7.更改php服務(wù)配置文件
cd /var/www/html
vim config.php
刪除其余內(nèi)容,保留內(nèi)容如下:
//varnish主機(jī)列表
//可定義多個(gè)主機(jī)列表
$var_group1 = array(
'host' => array('172.25.4.1'),
'port' => '80',
);
//varnish群組定義
//對主機(jī)列表進(jìn)行綁定
$VAR_CLUSTER = array(
'www.westos.org' => $var_group1,
);
//varnish版本
//2.x和3.x推送命令不一樣
$VAR_VERSION = "3";
>
注意:
bansys 有兩種工作模式,分別是:telnet 和 http 模式。
telnet 模式需要關(guān)閉 varnish 服務(wù)管理端口的驗(yàn)證,注釋掉/etc/sysconfig/varnish 文件中的
“ -S ${VARNISH_SECRET_FILE}”這行,重啟 varnish 服務(wù)即可
如果是 http 模式需要對 varnish 做以下設(shè)置(本次試驗(yàn)采用http模式推送)
8.更改varnish配置文件
vim /etc/varnish/default.vcl
#設(shè)置訪問控制
acl westos {
"127.0.0.1";
"172.25.4.0"/24;
}
在sub vcl_recv {} 中添加
if (req.request == "BAN") {
if (!client.ip ~ westos) {
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
刪除 return (pass);
9.重新加載varnish服務(wù)
/etc/init.d/varnish reload
2、測試:
物理機(jī)中:
用firefox訪問www.westos.org
打開另外一個(gè)網(wǎng)頁,用firefox訪問 172.25.4.1:8080
推送模式:HTTP
CDN群組:www.westos.org
推送內(nèi)容:
/index.html #文件
/images/* #目錄
本次試驗(yàn)推送文件 /index.html
推送一次,再訪問172.25.4.1:8080一次,發(fā)現(xiàn)循環(huán)讀取到server2和server3相應(yīng)的index.html內(nèi)容