varnish 原理和安装!

原理!(复杂的图!)


151108_giWQ_734134.jpg



处理过程大致分为如下几个步骤:
(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

varnish启动

运行指令:

/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


你可能感兴趣的:(varnish,原理和安装)