怎么在Linux系統(tǒng)中優(yōu)化Varnish緩存?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的環(huán)江網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!Linux是一種免費(fèi)使用和自由傳播的類UNIX操作系統(tǒng),是一個(gè)基于POSIX的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng),使用Linux能運(yùn)行主要的Unix工具軟件、應(yīng)用程序和網(wǎng)絡(luò)協(xié)議。
Varnish是一款高性能的開(kāi)源HTTP加速器,挪威較大的在線報(bào)紙 Verdens Gang 使用3臺(tái)Varnish代替了原來(lái)的12臺(tái)Squid,性能比以前更好。
但與老牌的squid相比,各有各的優(yōu)劣勢(shì),網(wǎng)上大量的相對(duì)比較只是在其個(gè)人對(duì)自己熟悉的應(yīng)用的較大使用上的發(fā)揮而已,可能squid到了有能力的人手上才足以發(fā)揮最強(qiáng)大的威力
Varnish采用了“Visual Page Cache”技術(shù),在內(nèi)存的利用上,Varnish比Squid具有優(yōu)勢(shì),它避免了Squid頻繁在內(nèi)存、磁盤(pán)中交換文件,性能要比Squid高。
通過(guò)Varnish管理端口,可以使用正則表達(dá)式快速、批量地清除部分緩存,這一點(diǎn)是Squid不能具備的。
本人就varnish的一些見(jiàn)解與配置方法做簡(jiǎn)單的介紹與筆記
實(shí)驗(yàn)環(huán)境:Red Hat Enterprise Linux Server release 5.4 (Tikanga)
內(nèi)核2.6.18-164.el5
yum install pcre-devel ##預(yù)先安裝一個(gè)軟件包,不然會(huì)提示錯(cuò)誤
tar zxvf varnish-2.1.3.tar.gz
cd varnish-2.1.3
./configure --prefix=/usr/local/varnish-2.1.3
make && make install
編輯配置文件,有模版,但太多注釋,好自己新建一個(gè)
vim /usr/local/varnish-2.1.3/etc/varnish/varnish.conf
############下面附上配置文件的內(nèi)容及注釋#######################
#http請(qǐng)求處理過(guò)程
#1,receive請(qǐng)求入口狀態(tài),根據(jù)vcl判斷pass還是lookup本地查詢
#lookup,在hash表中查找數(shù)據(jù),若找到則進(jìn)入hit狀態(tài),否則進(jìn)入fetch狀態(tài)
#pass,選擇后臺(tái),進(jìn)入fetch狀態(tài)
#fetch,對(duì)請(qǐng)求進(jìn)行后端的獲取,發(fā)送請(qǐng)求,獲得數(shù)據(jù),并進(jìn)行本地存儲(chǔ)
#deliver,將數(shù)據(jù)發(fā)送給客戶端,進(jìn)入done
#done,處理結(jié)束
##########配置后端服務(wù)器##############
復(fù)制代碼 代碼如下:
backend linuxidc01 {
.host = "192.168.1.142";
.port = "7070";
.probe = {
.timeout = 5s;
.interval = 2s;
.window = 10;
.threshold = 8;
}
}
backend linuxidc02 {
.host = "192.168.1.141";
.port = "7070";
.probe = {
.timeout = 5s;
.interval = 2s;
.window = 10;
.threshold = 8;
}
}
##############配置后端服務(wù)器組,進(jìn)行健康檢測(cè)6秒,使用random方式設(shè)置權(quán)重########
#########另一種方式round-robin則默認(rèn)輪詢機(jī)制####################
復(fù)制代碼 代碼如下:
director linuxidc15474 random
{ .retries = 6;
{ .backend = linuxidc02;
.weight = 2;
}
{ .backend = linuxidc01;
.weight = 2;
}
}
##########定義訪問(wèn)列表,允許下列地址清除varnish緩存#######################
復(fù)制代碼 代碼如下:
acl local {
"localhost";
"127.0.0.1";
}
########從url判斷針對(duì)哪類后面服務(wù)器及緩存配置############################
復(fù)制代碼 代碼如下:
sub vcl_recv
{
if (req.http.host ~ "^linuxidc15474.vicp.net") #匹配域名跳轉(zhuǎn)后臺(tái)服務(wù)器
{ set req.backend = linuxidc15474; }
else { error 404 "Unknown HostName!"; }
if (req.request == "PURGE") #不允許非訪問(wèn)控制列表內(nèi)的IP清除varnish緩存
{ if (!client.ip ~ local)
{
error 405 "Not Allowed.";
return (lookup);
}
}
#清除url中有jpg等文件的cookie
if (req.request == "GET" && req.url ~ "\.(jpg|png|gif|swf|jpeg|ico)$")
{
unset req.http.cookie;
}
#判斷req.http.X-Forwarded-For 如果前端有多重反向代理,這樣可以獲取客戶端IP地址。
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; }
##varnish實(shí)現(xiàn)圖片的防盜鏈
# if (req.http.referer ~ "http://.*)
# {
# if ( !(req.http.referer ~ "http://.*vicp\.net" ||
# req.http.referer ~ "http://.*linuxidc15474\.net" ) )
# {
# set req.http.host = "linuxidc15474.vicp.net";
# set req.url = "/referer.jpg";
# }
# return(lookup);
# }
# else {return(pass);}
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE")
{ return (pipe); }
#對(duì)非GET|HEAD請(qǐng)求的直接轉(zhuǎn)發(fā)給后端服務(wù)器
if (req.request != "GET" && req.request != "HEAD")
{ return (pass); }
##對(duì)GET請(qǐng)求,且url里以.php和.php?結(jié)尾的,直接轉(zhuǎn)發(fā)給后端服務(wù)器
if (req.request == "GET" && req.url ~ "\.(php)($|\?)")
{ return (pass); }
##對(duì)請(qǐng)求中有驗(yàn)證及cookie,直接轉(zhuǎn)發(fā)給后端服務(wù)器
if (req.http.Authorization || req.http.Cookie)
{ return (pass);}
{
##除以上的訪問(wèn)請(qǐng)求,從緩存中查找
return (lookup);
}
##指定的font目錄不進(jìn)行緩存
if (req.url ~ "^/fonts/")
{ return (pass); }
}
sub vcl_pipe
{ return (pipe); }
##進(jìn)入pass模式,請(qǐng)求被送往后端,后端返回?cái)?shù)據(jù)給客戶端,但不進(jìn)入緩存處理
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);
}
##在lookup后如果在cache中找到請(qǐng)求的緩存,一般以下面幾個(gè)關(guān)鍵詞結(jié)束
sub vcl_hit
{
if (!obj.cacheable)
{ return (pass); }
return (deliver);
}
##lookup后沒(méi)有找到緩存時(shí)調(diào)用,以下面幾個(gè)關(guān)鍵詞結(jié)束,及調(diào)用fetch參數(shù)重新測(cè)試是否加入緩存
sub vcl_miss
{ return (fetch); }
#讓varnish服務(wù)器緩存的類型,從后端取得數(shù)據(jù)后調(diào)用
sub vcl_fetch
{ if (!beresp.cacheable)
{ return (pass); }
if (beresp.http.Set-Cookie)
{ return (pass); }
##WEB服務(wù)器指明不緩存的內(nèi)容,varnish服務(wù)器不緩存
if (beresp.http.Pragma ~ "no-cache" || beresp.http.Cache-Control ~ "no-cache" || beresp.http.Cache-Control ~ "private")
{ return (pass); }
##對(duì)訪問(wèn)中g(shù)et有包含jpg,png等格式的文件進(jìn)行緩存,緩存時(shí)間為7天,s為秒
if (req.request == "GET" && req.url ~ "\.(js|css|mp3|jpg|png|gif|swf|jpeg|ico)$")
{ set beresp.ttl = 7d; }
##對(duì)訪問(wèn)get中包含htm等靜態(tài)頁(yè)面,緩存300秒
if (req.request == "GET" && req.url ~ "\/[0-9]\.htm$")
{ set beresp.ttl = 300s; }
return (deliver);
}
####添加在頁(yè)面head頭信息中查看緩存命中情況########
sub vcl_deliver
{
set resp.http.x-hits = obj.hits ;
if (obj.hits > 0)
{ set resp.http.X-Cache = "HIT cqtel-bbs"; }
else { set resp.http.X-Cache = "MISS cqtel-bbs"; }
}
#########################以上為 varnish的配置文件##########################
創(chuàng)建用戶:
groupadd www
useradd www -g www
創(chuàng)建 varnish_cache的緩存位置
mkdir /data/varnish_cache
啟動(dòng)varnish
ulimit -SHn 8192 ####設(shè)置文件描述符,因?yàn)槲业臋C(jī)子性能并不好,可以按照自己的配置去設(shè)置
/usr/local/varnish-2.1.3/sbin/varnishd -u www -g www -f /usr/local/varnish-2.1.3/etc/varnish/varnish.conf -a 0.0.0.0:80 -s file,/data/varnish_cache/varnish_cache.data,100M -w 1024,8192,10 -t 3600 -T 127.0.0.1:3500
####-u 以什么用運(yùn)行 -g 以什么組運(yùn)行 -f varnish配置文件 -a 綁定IP和端口 -s varnish緩存文件位置與大小 -w 最小,較大線程和超時(shí)時(shí)間 -T varnish管理端口,主要用來(lái)清除緩存
#結(jié)束varnishd進(jìn)程
pkill varnishd
啟動(dòng)varnishncsa用來(lái)將Varnish訪問(wèn)日志寫(xiě)入日志文件:
/usr/local/varnish-2.1.3/bin/varnishncsa -w /data/logs/varnish.log &
每天0點(diǎn)運(yùn)行,按天切割Varnish日志,生成一個(gè)壓縮文件,同時(shí)刪除上個(gè)月舊日志的腳本(/var/logs/cutlog.sh):
vim /usr/local/varnish-2.1.3/etc/varnish/cut_varnish_log.sh
寫(xiě)入以下腳本:
#!/bin/sh
# This file run at 00:00
date=$(date -d "yesterday" +"%Y-%m-%d")
pkill -9 varnishncsa
mv /data/logs/varnish.log /data/logs/${date}.log
/usr/local/varnish-2.1.3/bin/varnishncsa -w /data/logs/varnish.log &
mkdir -p /data/logs/varnish/
gzip -c /data/logs/${date}.log > /data/logs/varnish/${date}.log.gz
rm -f /data/logs/${date}.log
rm -f /data/logs/varnish/$(date -d "-1 month" +"%Y-%m*").log.gz
定時(shí)任務(wù):
crontab -e
00 00 * * * /usr/local/varnish-2.1.3/etc/varnish/cut_varnish_log.sh
優(yōu)化Linux內(nèi)核參數(shù)
vi /etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000 65000
使配置生效
/sbin/sysctl -p
通過(guò)Varnish管理端口,使用正則表達(dá)式批量清除緩存
清除所有緩存
/usr/local/varnish-2.1.3/bin/varnishadm -T 127.0.0.1:3500 url.purge *$
清除image目錄下所有緩存
/usr/local/varnish-2.1.3/bin/varnishadm -T 127.0.0.1:3500 url.purge /image/
127.0.0.1:3500 為被清除緩存服務(wù)器地址 www.linuxidc.com 為被清除的域名 /static/image/tt.jsp 為被清除的url地址列表
/usr/local/varnish-2.1.3/bin/varnishadm -T 127.0.0.1:3500 purge "req.http.host ~ www.linuxidc.com$ && req.url ~ /static/image/tt.jsp"
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
一個(gè)清除Squid緩存的PHP函數(shù)
復(fù)制代碼 代碼如下:
function purge($ip, $url)
{
$errstr = '';
$errno = '';
$fp = fsockopen ($ip, 80, $errno, $errstr, 2);
if (!$fp)
{
return false;
}
else
{
$out = "PURGE $url HTTP/1.1\r\n";
$out .= "Host:blog.s135.com\r\n";
$out .= "Connection: close\r\n\r\n";
fputs ($fp, $out);
$out = fgets($fp , 4096);
fclose ($fp);
return true;
}
}
purge("192.168.0.4", "/index.php");
?>
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
配置開(kāi)機(jī)自動(dòng)啟動(dòng)Varnish
vim /etc/rc.d/rc.local
在末行寫(xiě)入以下內(nèi)容:
ulimit -SHn 8192
/usr/local/varnish-2.1.3/sbin/varnishd -u www -g www -f /usr/local/varnish-2.1.3/etc/varnish/varnish.conf -a 0.0.0.0:80 -s file,/data/varnish_cache/varnish_cache.data,100M -w 1024,8192,10 -t 3600 -T 127.0.0.1:3500
/usr/local/varnish-2.1.3/bin/varnishncsa -w /data/logs/varnish.log &
查看Varnish服務(wù)器連接數(shù)與命中率:
/usr/local/varnish-2.1.3/bin/varnishstat
以上為varnish的狀態(tài),
1675 0.00 0.06 Client requests received 為服務(wù)端接收的客戶端請(qǐng)求次數(shù)
179 0.00 0.01 Cache hits 為命中緩存,從緩存中取得數(shù)據(jù)返回給客戶端的次數(shù),即命中率
11 0.00 0.00 Cache misses 為跳過(guò)pass緩存,從后端服務(wù)應(yīng)用中取得數(shù)據(jù)返回給用戶的次數(shù)
用help看看可以使用哪些Varnish命令:
/usr/local/varnish-2.1.3/bin/varnishadm -T 127.0.0.1:3500 help
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,的支持。