原理!(复杂的图!)
处理过程大致分为如下几个步骤:
(1) Receive状态,也就是请求处理的入口状态,根据VCL规则判断该请求应该是Pass或Pipe,或者进入Lookup(本地查询)。
(2) Lookup状态,进入此状态后,会在hash表中查找数据,若找到,则进入Hit状态,否则进入miss状态。
(3) Pass状态,在此状态下,会进入后端请求,即进入fetch状态。
(4) Fetch状态,在Fetch状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地的存储。
(5) Deliver状态, 将获取到的数据发送给客户端,然后完成本次请求。
3、内置公用变量
VCL内置的公用变量可以用在不同的VCL函数中,根据这些公用变量使用的不同阶段,下面依次介绍。
当请求到达后,可以使用的公用变量如表2所示:
表2
公用变量名称 含义
req.backend 指定对应的后端主机
server.ip 表示服务器端IP
client.ip 表示客户端IP
req.request 指定请求的类型,例如GET、HEAD、POST等
req.url 指定请求的地址
req.proto 表示客户端发起请求的HTTP协议版本
req.http.header 表示对应请求中的http头部信息
req. restarts 表示请求重启的次数,默认最大值为4
Varnish 在向后端主机请求时,可以使用的公用变量如表3所示:
表3
公用变量名称 含义
beresp.request 指定请求的类型,例如GET、HEAD等
beresp.url 指定请求的地址
beresp .proto 表示客户端发起请求的HTTP协议版本
beresp .http.header 表示对应请求中的http头部信息
beresp .ttl 表示缓存的生存周期,也就是cache保留多长时间,单位是秒
从cache或者后端主机获取内容后,可以使用的公用变量如表4所示:
表4
公用变量名称 含义
obj.status 表示返回内容的请求状态代码,例如200、302、504等
obj.cacheable 表示返回的内容是否可以缓存,也就是说,如果HTTP返回是200、203、300、301、302、404、410等,并且有非0的生存期,则可以缓存
obj.valid 表示是否是有效的HTTP应答
obj.response 表示返回内容的请求状态信息
obj.proto 表示返回内容的HTTP协议版本
obj.ttl 表示返回内容的生存周期,也就是缓存时间,单位是秒
obj.lastuse 表示返回上一次请求到现在的间隔时间,单位是秒
对客户端应答时,可以使用的公用变量如表5所示:
表5
公用变量名称 含义
resp.status 表示返回给客户端的HTTP状态代码
resp.proto 表示返回给客户端的HTTP协议版本
resp.http.header 表示返回给客户端的HTTP头部信息
resp.response 表示返回给客户端的HTTP状态信息
在上面的讲述中,我们只是介绍了常用的VCL内置公用变量,如果需要了解和使用更多的公用变量信息,请登录varnish官方网站查阅。
Varnish 安装需要pcre ,安装pcre 最好下载源码包进行安装,本次安装部署采用的版本是8.31 。下载完成的源码包文件为 :pcre-8.31.tar
varnish 由于开源软件最新版往往稳定性有待检查,所以本次安装部署并非最新版,而是采用稳定版本的 3.0.0 。下载完成的源码包文件为 :varnish-3.0.0.tar 。
以root 用户登录OA 反向代理主机,在root 默认目录下建立 pkg_install 目录,并将上述两个源码包copy 到此目录下。
1. 编译安装 pcre
进入 pkg_install 目录,执行以下指令:
tar �Czvxf pcre-8.31.tar
cd pcre-8.31
./configure
make && make install
2. 编译安装varnish
安装pkg 时,需要在make文件生成时指定 pcre 的安装位置,进入 pkg_install 目录,执行以下指令:
tar �Czvxf varnish-3.0.0.tar
cd varnish-3.0.0
./configure �Cprefix=/usr/local/varnish PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
make && make install
部署环境:
两台tomcat 服务器,每台服务器开放三个端口80、8080、8081,前端需要架设一台代理服务器,对后端的两台tomcat进行代理访问,主要作用为缓存、负载均衡的作用,并可减轻后端服务器压力。
在进行配置之前,需要了解varnish http请求处理过程:
1:vcl_recv : 客户端请求调用,根据vcl判断pass还是lookup本地查询。
2:lookup的过程是在hash表中查找数据,若找到则进入hit状态,否则进入fetch状态。
3:pass选择后台直连服务器,进入fetch状态。
4:fetch,调用 vcl_fetch,并对请求进行后端获取,获得数据后安装规则进行本地缓存
5:deliver:将数据发送给客户端,进入done
6:done:处理流程结束。
下图是来源网上,可形象描述各个函数调用流程:
根据以上流程,对varnish 的配置文件行配置,由于每一varnish的进程启动实例只能对单一端口进行监听,所以需要三个varnish启动实例才能对后台的三个端口80、8080、8081 进行监听。暂时以80端口监听的配置文件做以下重点说明:
1:建立两个 backend ,其中每个 backend 对应一个IP、port,并加入后台服务器检查机制,检查的url 为定位登陆首页“/seeyon/index.jsp”,检查间隔3秒每次。
backend webOA01 {
.host = "192.168.20.216";
.port = "80";
.connect_timeout = 1s;
.first_byte_timeout = 5s;
.between_bytes_timeout = 2s;
.probe = {
.url = "/seeyon/index.jsp";
.timeout = 0.3s;
.window = 8;
.threshold = 3;
.initial = 3;
}
}
backend webOA02 {
.host = "192.168.20.217";
.port = "80";
.connect_timeout = 1s;
.first_byte_timeout = 5s;
.between_bytes_timeout = 2s;
.probe = {
.url = "/seeyon/index.jsp";
.timeout = 0.3s;
.window = 8;
.threshold = 3;
.initial = 3;
}
}
2:建立后台访问控制组 webOAacc 。分配权重为均等,客户端访问方式为 client方式(由于session 问题,不能采用 random round-robin 方式):
director webOAacc client
{
{
.backend = webOA01;
.weight = 1;
}
{
.backend = webOA02;
.weight = 1;
}
}
3:建立清理缓存请求的IP权限:
acl purge{
"localhost";
"127.0.0.1";
"192.168.20.144";
}
4:配置 vcl_recv 函数:此函数为客户端请求后首先调用的函数,所以访问控制流程均在此函数中配置:
主机域名访问分流
if (req.http.host ~ "192.168.20.218"){
set req.backend = webOAacc;
}
如果访问主机地址为 192.168.20.218 ,则要求varnish 通过访问控制组webOAacc去分发后台,具体规则见 webOAacc的配置。
多层代理处理,获取客户端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;
}
处理浏览器编码差异造成的缓存内存浪费
if (req.http.Accept-Encoding)
{
if (req.url ~ "\.(jpg|png|gif|jpeg)(\?.*|)$") {
remove req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
remove req.http.Accept-Encoding;
}
}
非正常浏览器请求,全部直接pipe管道到后端服务器:
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE")
{
return (pipe);
}
非get、head请求时pass到后端服务器:
if (req.request != "GET" && req.request != "HEAD") {
return (pass);
}
不在需要缓存的内容列表里,直接pass到后端服务器:
If(req.url!~\.(gif|jpg|swf|css|js|png|jpg|jpeg|gif|png|tiff|tif|svg|swf|ico|doc|ppt|pps|xls|odc|odb|odf|odg|odi|odp|ods|odt|sxc|sxd|sxi|sxw|txt)") {return (pass); }
剩余的全部在缓存中查找
return (lookup);
5:配置 vcl_fetch 函数,vcl_fetch 是后台返回数据后调用的函数,配置时刻决定哪些内容缓存:
在缓存内容列表中的,保存30天的缓存期限:
if (req.request == "GET" && req.url ~ "\.(gif|jpg|swf|css|js|png|jpg|jpeg|gif|png|tiff|tif|svg|swf|ico|doc|ppt|pps|xls|odc|odb|odf|odg|odi|odp|ods|odt|sxc|sxd|sxi|sxw|txt)")
{
remove beresp.http.Set-Cookie;
set beresp.ttl = 30d;
}
6:配置完成保存到/usr/local/varnish/etc/varnish/default.vcl .
启动主进程为 /usr/local/varnish/sbin/varnishd ,携带参数做如下说明:
-s malloc,1024m:表示开辟1g内存作为缓存空间。
-T 0.0.0.0:201 :varnish 管理端口201 。
-a 0.0.0.0:80 :访问监听端口80 。
-p 为进程池以及进程池参数配置等信息。
-f /usr/local/varnish/default.conf :配置文件位置
-n /usr/local/varnish/var/varnish/fanxiangdaili :配置文件编译 so 的位置
为了网络访问安全,设置防火墙INPUT为 DROP模式,OUTPUT为ACCEPT模式,FORWORD为DROP模式。
清除原始防火墙配置:
iptables �CF
iptables �CX
iptables �CP INPUT DROP
iptables �CP OUTPUT ACCEPT
iptables �CP FORWORD DROP
加入访问端口:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #ssh端口
iptables -A INPUT -p tcp --dport 201 -j ACCEPT #varnish管理端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #web 访问端口
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT #移动访问端口
iptables -A INPUT -p tcp --dport 8081 -j ACCEPT #https端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT #ftp端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT #ftp端口
iptables -A INPUT -p tcp --dport 161 -j ACCEPT #snmp端口
iptables -A OUTPUT -p icmp -j ACCEPT #开通 ping
iptables -A INPUT -i lo -p all -j ACCEPT #dns处理
保存重启:
/etc/init.d/iptables save
service iptables restart
chkconfig iptables on
运行指令:
/usr/local/varnish/sbin/varnishd -f /usr/local/varnish/etc/varnish/default.vcl -s malloc,1024m -T 127.0.0.1:201 -a 0.0.0.0:80
相关文章
http://blog.chinaunix.net/uid-20375449-id-3701202.html
http://my.oschina.net/guol/blog/108323
http://blog.s135.com/post/313