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
1、创建www用户和组,以及Varnish缓存文件存放目录(/var/vcache):
/usr/sbin/groupadd www -g 48
/usr/sbin/useradd -u 48 -g www www
mkdir -p /var/vcache
chmod +w /var/vcache
chown -R www:www /var/vcache
2、创建Varnish日志目录(/var/logs/):
mkdir -p /var/logs
chmod +w /var/logs
chown -R www:www /var/logs
3、编译安装varnish:
官方下载地址:
wget http://www.varnish-software.com/sites/default/files/varnish-2.1.4.tar.gz
标准安装:
yum -y install automake autoconf libtool ncurses-devel libxslt groff pcre-devel pkgconfig
cd varnish-2.1.4
./configure --prefix=/usr/local/varnish
make && make install
4、创建Varnish配置文件:
vim /usr/local/varnish/etc/varnish/default.vcl
输入以下内容:
backend webserver {
.host = "127.0.0.1";
.port = "80";
}
sub vcl_recv {
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;
}
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
return (pipe);
}
if (req.request != "GET" && req.request != "HEAD") {
return (pass);
}
if (req.http.host ~ "^(.*).sns.test") {
set req.backend = webserver;
}
if (req.url ~ ".(jsp|php|do)($|?)") {
return (pass);
} else {
return (lookup);
}
}
sub vcl_pipe {
return (pipe);
}
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);
}
sub vcl_hit {
if (!obj.cacheable) {
return (pass);
}
return (deliver);
}
sub vcl_miss {
return (fetch);
}
sub vcl_fetch {
if (!beresp.cacheable) {
return (pass);
}
if (beresp.http.Set-Cookie) {
return (pass);
}
if (req.request == "GET" && req.url ~ ".(png|png|gif|jpg|css|js|html|htm)$") {
set beresp.ttl = 3600s;
}
return (deliver);
}
sub vcl_deliver {
if (obj.hits > {
set resp.http.X-Cache = "HIT from www.sns.test";
} else {
set resp.http.X-Cache = "MISS from www.sns.test";
}
return (deliver);
}
通过netstat -tlnp查看nginx监控80端口。Varnish通过反向代理请求后端IP为127.0.0.1,端口为80的nginx服务器;
5、启动varnish:
/usr/local/varnish/sbin/varnishd -n /var/vcache -f
/usr/local/varnish/etc/varnish/default.vcl
-a 0.0.0.0:8090 -s file,/var/vcache/varnish_cache.data,1G -g www -u www -w 30000,51200,10
-T 127.0.0.1:3500 -p client_http11=on
解释一下8090是varnish监听的端口,例如http://www.sns.test:8090会反向请求127.0.0.1:80服务器,而gif,js等格式的文件会存在varnish缓存服务器中。查看这几种格式文件是否多个X-Cache报头。如果保存成功会显示:HIT from www.sns.test。127.0.0.1:3500这个是管理缓存的ip。此处的www.sns.test是自己配置的虚拟主机。
参数说明:
-n 缓存写入路径
-f 指定配置文件启动
-a 监听本机的网卡的80端口
-T 指定本机的varnish管理端口
-s file 指定varnish缓存文件的位置以及大小
-w 指处理的最小请求数、最大请求数、超时时间
-g 组名
-u 用户名
-p client_http11=on 支持http1.1协议
-P 指定其进程码文件的位置
6、启动varnishncsa用来将Varnish访问日志写入日志文件:
/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/logs/varnish.log &
# 通过 Varnish 管理端口進行管理
/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 help
# 清除具体URL地址
/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge /a/
/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge w*$
# 清除所有缓存
/usr/local/varnish-2.1/bin/varnishadm -T 127.0.0.1:3500 url.purge *$
# 通过varnishstat监控varnish状态
/usr/local/varnish/bin/varnishstat –n var/vcache