varnish是一款http反向代理服务器,占用资源少,效率高,能加快您的web站点访问速度
官方站点:https://www.varnish-cache.org/
1.varnish安装
我在ubuntu12上安装的varnish3.0.5版本,依次执行一下命令
curl http://repo.varnish-cache.org/debian/GPG-key.txt | sudo apt-key add -
echo "deb http://repo.varnish-cache.org/ubuntu/ precise varnish-3.0" | sudo tee -a /etc/apt/sources.list
sudo apt-get update
sudo apt-get install varnish
如果是其他系统安装varnish,也可以从官网找到安装步骤:
https://www.varnish-cache.org/releases/varnish-cache-3.0.5
安装过程中可能要你更新或者安装其他依赖的包,按照提示安装完成即可
2.重要目录与脚本
安装完成后,varnish安装在如下几个重要目录
(1)安装目录:/usr/lib/varnish/
(2)配置文件所在目录:/etc/varnish/ 默认使用default.vcl配置脚本
(3)启动项所在目录:/usr/sbin/varnishd 其实varnishd就是一个启动项脚本,用它来执行很多重要命令
比如执行
/usr/sbin/varnishd
help 就能打印出varnishd这个脚本支持的选项,比如
很多选项,试试或者网上查下资料就知道怎么用
(4)varnish使用工具所在目录:/usr/bin/
比如varnishadm、varnishlog、varnishhist 等等很多实用工具都在这个目录
你可使用find命令列出这些工具
(5)varnish开机启动项 /etc/init.d/varnish
也可用它直接启动、关闭、检测varnish的状态,先查看帮助命令
说明有 start stop restart 等等命令你可以使用,比图
/etc/init.d/varnish start 就是启动varnish 不过这里没指定启动的参数
/etc/init.d/varnish status 可以查看varnish的启动状态
3.varnish启动与配置
(1)典型的vcl配置,编辑default.vcl配置脚本,根据自己的实际需求调整
#backend 定义后端服务器:告诉varnish遇到http请求应该从哪里去获取请求对应的内容
#可以指定为web服务器地址,比如apache;也可以指定为应用服务器地址,比如tomcat
#一般来说,varnish先从缓存查找,如果没命中才会去后端服务器请求
backend ihs1 {
.host = "127.0.0.1";
.port = "8080";
}
#如果有多个web/应用服务器,说明你有负载均衡设置,那么定义多个后端服务器即可
#backend ihs2 {
# .host = "127.0.0.1";
# .port = "8080";
#}
#定义varnish允许来自哪些IP段的清楚缓存的命令
acl purge {
"localhost";
"127.0.0.1";
#"10.23.17.0"/24;
}
#如果多个web服务器要做负载均衡,就这么配置
#director 还有多种方式可以指定
director ihs_director round-robin {
{ .backend = ihs1;}
#{ .backend = ihs2;} # 有多个则加多个后端服务器即可
}
#处理http请求
sub vcl_recv {
set req.backend = ihs_director;
#如果是get请求则尝试从缓存查找,因为POST请求一般是表单提交,不要缓存
if(req.request == "GET" && req.url ~ "^/.*$") {
unset req.http.cookie;
if (! req.backend.healthy) {
set req.grace = 30m;
} else {
set req.grace = 15s;
}
if(req.restarts == 0){
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;
}
}
return (lookup);
}
#如果是BAN命令,说明收到来自客户端清除varnish缓存的命令
if (req.request == "BAN") {
if (!client.ip ~ purge) {
error 405 "Not allowed";
}
set req.url = regsuball(req.url,"%28","(");
set req.url = regsuball(req.url,"%29",")");
set req.url = regsuball(req.url,"%7C","|");
if (req.url ~ "^/$") {
ban("req.url == " + req.url);
} else {
ban("req.url ~ " + req.url);
}
error 200 "Ban added";
} elsif (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed";
}
return(lookup);
}
return (pass);
}
#命中
sub vcl_hit {
if (req.request == "PURGE") {
purge;
error 200 "Purged.";
}
}
#未命中
sub vcl_miss {
if (req.request == "PURGE") {
purge;
error 200 "Not in cache.";
}
}
#处理错误请求
sub vcl_error {
if (obj.status == 750) {
set obj.http.Location = "http://www.suning.com/";
set obj.status = 302;
}
return(deliver);
}
#表示varnish已经从后端服务器获取内容,现在将控制权交给varnish来处理
#一般情况下,就是将该内容缓存起来
sub vcl_fetch {
if(beresp.status >= 400){
set beresp.ttl = 0s;
set beresp.http.Cache-Control = "no-cache,no-store,max-age=0";
}
if(beresp.http.Content-Length == "0" ){
set beresp.ttl = 0s;
}
if(beresp.http.Cache-Control ~ "no-cache,no-store,max-age=0"){
set beresp.ttl = 0s;
}
#定义显示在http请求头中消息
set beresp.http.Server = "SNWS";
set beresp.grace = 30m;
unset beresp.http.Set-Cookie;
set beresp.http.Last-Modified = now;
set beresp.http.magicmarker = "1";
}
sub vcl_deliver{
if (resp.http.magicmarker) {
/* Remove the magic marker */
unset resp.http.magicmarker;
/* By definition we have a fresh object */
set resp.http.age = "0";
}
#如果命中,定义显示在http请求头消息中的标志
#可应firefox的firebug工具查看这些请求头
if (obj.hits > 0) {
set resp.http.X-Cache = "Test-HIT_24";
set resp.http.X-Cache-Hits = obj.hits;
} else {
set resp.http.X-Cache = "Test-MISS_24";
}
unset resp.http.X-Varnish;
unset resp.http.Expires;
set resp.http.Via = "1.1 Xcache_Test_24";
}
(2)启动varnish
第一个注意事项:
启动之前可以先检测varnish的启动状态,有多种方式
/etc/init.d/varnish status 或者 /etc/init.d/varnish status
如果是处于启动状态,你可以停止:/etc/init.d/varnish stop 或者直接关闭与varnish相关的进程 pkill varnish
第二个注意事项:
启动varnish,注意你的default.vcl配置,我这里后端服务器配置的是apache
backend ihs1 {
.host = "127.0.0.1";
.port = "80";
}
由于apache本身就占用了80端口,用户访问web应用,比如地址是:
http://localhost/demo/index.jsp
那么加了一道varnish缓存之后,这个web请求应该先交给varnish来处理
那么varnish启动时也要占用一个端口,一般生产系统varnish和apache不在同一台机器
并且varnish也要使用80端口才行,不然用户输入地址,你还的让它输个端口号呢。。。
本机测试,80端口已经给apache使用了,就随便用个端口来处理,比如 6081
启动命令如下,我指定了一些配置:
/usr/sbin/varnishd -f /etc/varnish/default.vcl -s malloc,128M -a 0.0.0.0:6081 -T 127.0.0.1:2000
-f:指定以哪个vcl配置脚本启动
-s:分配内存 malloc 是一种分配内存的函数
-a:指定varnish本身以哪个端口启动,之前以说明apache占用了80端口,此处就随便指定一个
-T:varnish的管理端口
还有很多启动项可以配置,看看官方资料就明白了
4.测试varnish缓存
假设你本机apache或者tomcat应用是启动的,我本机是启动了apache
正常情况下,访问apache的默认主页:http://lolcalhost/
应该打印如下信息:
由于你启动了varnish,且使用的是6081端口
那么为了使varnish处理你的http请求,你应该使用6081端口来访问
注意前面已经说过:生产环境下,varnish和apache应该在不同机器上,都要使用80端口
这里由于在同一个机器,因此 6081 只做演示,看到这个页面,至少说明:
varnish从后端服务器已经取道内容了,也就是
http://localhost:6081/ 其实已经转给 apache 的 http://localhost:80 端口处理
并且varnish从apache那边获取到内容了,现在来看看是否有缓存效果
多刷新几次页面,看看效果:
如果看到Hits:3 说明命中了3次,不信你可以把apache停掉
在访问这个页面仍然是可以打开的,因为varnish已经对这个http请求做了整体页面缓存