一,什么是varnish
Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。
Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多。在1975年时,储存媒介只有两种:内存与硬盘。但现在计算机系统的内存除了主存外,还包括了CPU内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此Squid Cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache设计架构。
Varnish的理念是好的,但是Varnish还没有稳定到可以完全替代Squid的程度,现在就抛弃Squid选择Varnish是不明智的。
二,安装varnish
http://sourceforge.net/projects/varnish/files/
tar zxvf varnish-2.1.tar.gz
cd varnish-2.1
./configure –prefix=/usr/local/varnish
make && make install
三,varnish的配置文件
vi /usr/local/varnish/vcl.conf
输入以下内容
-
backend testserver {
-
set backend.host = "127.0.0.1" ;
-
set backend.port = "10000" ;
-
}
-
-
backend imageserver {
-
set backend.host = "127.0.0.1" ;
-
set backend.port = "10001" ;
-
}
-
-
acl purge {
-
"localhost" ;
-
"127.0.0.1" ;
-
"192.168.1.0" /24;
-
}
-
-
sub vcl_recv {
-
if (req.request == "PURGE" ) {
-
if (!client.ip ~ purge) {
-
error 405 "Not allowed." ;
-
}
-
lookup;
-
}
-
-
if (req.http.host ~ "^localhost" ) {
-
set req.backend = testserver;
-
-
} elseif (req.http.host ~ "^127.0.0.1" ) {
-
set req.backend = imageserver;
-
-
} else {
-
error 404 "test Cache Server" ;
-
}
-
-
if (req.request != "GET" && req.request != "HEAD" ) {
-
pipe;
-
}
-
if (req.http.Expect) {
-
pipe;
-
}
-
if (req.http.Authenticate || req.http.Cookie || req.url ~ "/.(php|cgi)($|/?)" ) {
-
pass;
-
}
-
if (req.request == "GET" && req.url ~ "/.(txt|js|jpg|gif|png|bmp|css)$" ) {
-
lookup;
-
}
-
lookup;
-
}
-
-
sub vcl_hit {
-
if (req.request == "PURGE" ) {
-
set obj.ttl = 0s;
-
error 200 "Purged." ;
-
}
-
}
-
-
sub vcl_miss {
-
if (req.request == "PURGE" ) {
-
error 404 "Not in cache." ;
-
}
-
}
-
-
sub vcl_fetch {
-
if (obj.http.Pragma ~ "no-cache" || obj.http.Cache-Control ~ "no-cache" || obj.http.Cache-Control ~ "private")
-
{
-
pass;
-
}
-
if (req.request == "GET" && req.url ~ "/.(txt|js|jpg|gif|png|bmp|css)$" ) {
-
set obj.ttl = 3600s;
-
}
-
else {
-
set obj.ttl = 30d;
-
}
-
}
-
-
sub vcl_hash
-
{
-
set req.hash += req.url;
-
if (req.http.host)
-
{
-
set req.hash += req.http.host;
-
}else {
-
set req.hash += server.ip;
-
}
-
hash;
-
}
-
-
sub vcl_pipe {
-
pipe;
-
}
-
-
sub vcl_pass {
-
pass;
-
}
简单说明一下:
1,设置反向请求的IP,127.0.0.1:10000和127.0.0.1:10001
2,允许缓存管理,localhost,127.0.0.1,192.168.0.*
3,varnish对匹配localhost请求跳到testserver,对匹配127.0.0.1的请求跳 到imageserver,如果都没有,显示test Cache Server
4,Varnish对HTTP协议中的GET、HEAD请求进行缓存,对POST请求透过,让其直接访问后端Web服务器。放过php,cgi不对其进行缓存,只缓存,静态文件
5,对以.txt.js.jpg.gif.png.bmp.css结尾的URL缓存时间设置1小时,对其他的URL缓存时间设置为30天。
四,优化Linux内核参数
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
ldconfig 进行重新加载
五,启动varnish和varnishncsa,并查看
ulimit -SHn 51200
/usr/local/varnish/sbin/varnishd -n /var/vcache -f /usr/local/varnish/vcl.conf -a :8080 -s file,/var/vcache/varnish_cache.data,1G -g users -u zhangy -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on
/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/vlogs/varnish.log &
解释一下8080 是varnish监听的端口,例如127.0.0.1:8080会反向请求127.0.0.1:10001图片服务器,127.0.0.1:3500 这个是管理缓存的ip
[zhangy@BlackGhost ~]$ ps -e|grep varnish
3970 ? 00:00:00 varnishd
3971 ? 00:00:00 varnishd
3977 pts/0 00:00:00 varnishncsa
六、通过Varnish管理端口,使用正则表达式批量清除缓存:
1,例:清除类似http://127.0.0.1:8080/00/01的URL地址:
[root@BlackGhost varnish]# /usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge /00/
2,例:清除类似http://127.0.0.1:8080/00/0144的URL地址:
[root@BlackGhost varnish]# /usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge /d*$
3,例:清除类似http://127.0.0.1:8080/00/01/RwGowEtWvcQAAAAAAAAWHH0Rklg81.gif的url地址
[root@BlackGhost varnish]# /usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge gif$
4,清除所有
[root@BlackGhost varnish]# /usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge *$
5,怎么测试你知道有没有清除缓存
在地址栏输入http://127.0.0.1:8080/00/01/RwGowEtWvcQAAAAAAAAWHH0Rklg81.gif
然后涮新几次你发现以下内容
清缓存前
说明:请求了8次,后台请求1次,缓存7次
清除缓存
[root@BlackGhost varnish]# /usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge gif$
然后在请求http://127.0.0.1:8080/00/01/RwGowEtWvcQAAAAAAAAWHH0Rklg81.gif
你会发现以下内容
缓存清后
说明:请求数变了,缓存数没变,后台请求数变了,说明刚才请缓存是有效果的。
七,进行缓存测试,以及部分参数说明
varnish
上图中199719表示用户请求数;
上图中199704表示用户请求收到数
上图中199688表示这个缓存命中次数,就是缓了多少次
上图中第一个2表示没有缓存数,第一次访问都不会被缓存的,memcache也是
上图中第二个2表示后台处理数,没缓存当然要交到后台处理
(责任编辑:IT) |