安装前准备
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
访问 192.168.20.218 即可,整个安装部署完成。
其他两个主机端口的代理配置思路也是一样,只是端口不同而已,启动命令为:
移动监听启动命令:
/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:8080 �Cn /usr/local/varnish/var/varnish/mob
https监听启动命令:
/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:8080 �Cn /usr/local/varnish/var/varnish/https
后端服务器检查结果正常:
Varnish 状态正常,访问时缓存shm 各项指标在逐步增加中: