共计 4389 个字符,预计需要花费 11 分钟才能阅读完成。
若是有对以下的配置命令有不明晰的,有翻译的 VCL 手册(见 http://www.linuxidc.com/Linux/2014-03/98011.htm),可以进行查阅!
1. 什么是 varnish?
1、varnish 首先是一个反向代理服务器,其次才是一个 web 加速缓存服务器。它所缓存的对象是 key/value(即键 / 值)的形式来存储的,通常情况下,键一般是指 URL,而值就是 URL 问的具体的资源(或称为对象)。
2、varnish 的配置文件是由专门的 VCL(即 varnish 配置语言)来进行配置的。这种语言首先要先转换为 C 代码,然后在执行。
3、varnish 支持 epoll、kqueue 等这种高性能的 I / O 事件通知模型。
4、varnish 的日志在它所申请的共享内存日志中。默认为 80M,
2. varnish 的原理
1、varnish 启动后包含两个进程,一个是 management 进程和 child 进程。
2、management 进程主要用来管理配置文件以及对子进程的监控和对 varnish 的初始化,而且提供了一个命令行管理接口等。
3、child 进程由几个不同类型的线程组成,比较典型的有:
● acceptor 线程:用来接收新连接
● worker 线程:具体工作的线程,一个线程对应一个连接会话。
● expiry 线程:对过期的线程进程清除。
3. varnish 支持的缓存存储类型:
● file:使用特定的文件存储所有的缓存数据,然后在通过 mmap() 这个系统调用将整个文件的数据映射到进程空间。不过,重启或停止 varnish 后,缓存的内容会消失,也就是说不能持久存储。
● malloc:使用 malloc() 系统调用在 varnish 启动的时候想内存申请固定大小的内存来缓存数据。
● persistent:还处于测试时期,不建议使用。
注:存储类型使用 - s 参数来指定。
4. 安装与配置
环境:CentOS6.5,iptables 和 selinux 为关闭状态。
软件包:varnish-3.0.5-1.el6.x86_64.rpm
varnish-docs-3.0.5-1.el6.x86_64.rpm
varnish-libs-3.0.5-1.el6.x86_64.rpm
下载地址:
http://repo.varnish-cache.org/RedHat/varnish-3.0/el6/x86_64/varnish/
前端:varnish 服务器,两块网卡:
eth0: 172.16.0.11
eth1: 192.168.0.11
后端:两台 apache 服务器,各一块网卡:
web1: 192.168.0.12
web2: 192.168.0.13
网关:192.168.0.11
配置文件:
目录:/etc/varnish
文件:default.vcl
secret #用于管理接口所使用的共享密钥文件
脚本:/etc/rc.d/init.d/varnishd
脚本配置文件:/etc/sysconfig/varnish #用于指定配置参数
其中:-a <[hostname]:port> : 指定 varnish 服务监听的地址和端口
-f <filename> : 指定 VCL 文件路径
-p <parameter=value> : 用于调整参数值
-S <secretfile> : 命令行管理接口的认证加密文件
-T <hostname:port> : 指定管理的地址和接口
-s <storagetype,options> : 指定缓存对象的存储类型和位置,以及大小等
负载均衡支持的算法:
● round-robin : 没有额外的参数
● random:包含有两个参数:
1、.weight:表示权重越大,对应的后端服务器接收的请求越多,可以对每个后端服务器进行设置。
2、.retries : 用于定义查找后端健康服务器的次数。是对整个 director 进行设置的。
● hash:它是 random 的一个特殊变体,它使用缓存中的 hash 数据来进行调度,也就是说相同的 URL 的请求将会发往相同的 web 服务器。这种调度方法非常适合后端服务器还是缓存服务器的情况。
● client:它也是 random 的一个特殊变体。它使用 client.identity 来进行调度,此变量默认值是客户端的 IP,但是可以在 VCL 中改变其值。使用这种算法,如果所有 请求的 client.identity 的值相同的话,那么统一客户端的请求都会发往同一个后端服务器。
● dns:它是根据客户端请求 Host 头部信息,在一个给定的后端服务器列表中进行查找 匹配的。(此算法用的不多)
特性:先定义后调用,有先后顺序之分,只定义不调用会报错。比如,在定义 director 后必须在后面对其进行调用否则会发生编译错误。
1、将 varnish 的监听接口改为 80
vim /etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80
2、定义后端服务器
backend web1 {
.host = “192.168.0.12”;
.port = “80”;
}
backend web2 {
.host = “192.168.0.13”;
.port = “80”;
}
3、定义负载均衡 director(即调度器)
director webs round-robbin {
{.backend = web1;}
{.backend = web2;}
}
4、调用上面定义的 director
sub vcl_recv {
set req.backend = webs;
return(pass); #测试的时候把默认配置的 return(lookup) 改为 return(pass),否 则,后续的请求就直接去查找缓存了,看不出测试效果。
}
5、定义对后端进行健康状态的检测,需要在 backend 区段的上面,并在 backend 区段进行引用
probe healthchk {
.url = “/”;
.interval = 3s;
.timeout = 10ms
.window = 3;
.threshold = 2;
.initial = 3;
.expected_response = 200;
}
backend web1 {
.probe = healthchk;
}
backend web2 {
.probe = hearlthchk;
}
6、定义动静分离,假定 web1 提供动态内容,web2 提供静态内存,不过要先把 director 端注释掉
sub vcl_recv {
if (req.url ~ “(?i)\.php$”) {
set req.backend = web1;
} else {
set req.backend = web2;
}
}
sub vcl_fetch {
set beresp.http.From-Backend = beresp.backend.ip; #用于测试是否动静个来自对应的服务器
}
7、定义反盗链功能
sub vcl_recv {
if (req.http.referer ~ “http://.*”) {
if (!(req.http.referer ~ “http://.*\.google\.com” ||
req.http.referer ~ “http://.*\.baidu\.com” ||
req.http.referer ~ “http://.*\.myselfsite\.com”))
{
set req.http.host = “www.myselfsite.com”;
set req.url = “/login/login.html”;
}
}
}
8、如何知道缓存是否命中,以及命中的次数
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Varnish-Cache = “HIT”;
set resp.http.X-Cache-Hits = obj.hits;
} else {
set resp.http.X-Varnish-Cache = “MISS”;
}
}
9、去掉对静态文件请求时所带的 Cookie 信息,可以提供缓存命中率
sub vcl_recv {
if (req.url ~ “(?i)\.(html|htm|jpg|gif|ico|jpeg|png|js|css|swf)(\?[a-z0-9]+)?$”) {
unset req.http.Cookie;
}
}
sub vcl_fetch {
if (req.url ~ “(?i)\.(html|htm|jpg|gif|ico|jpeg|png|js|css|swf)(\?[a-z0-9]+)?$”) {
unset beres.backend.set-cookie;
}
}
10、手动清除过期的缓存
acl purgers {
“127.0.0.1”;
“192.168.0.0”/24;
}
sub vcl_recv {
if (req.request == “PURGE”) {
if (!client.ip ~ purgers) {
error 405 “Method not allowed”;
}
return (lookup);
}
}
sub vcl_hit {
if (req.request == “PURGE”) {
purge;
error 200 “Purged”;
}
}
sub vcl_miss {
if (req.request == “PURGE”) {
purge;
error 404 “Not in cache”;
}
}
sub vcl_pass {
if (req.request == “PURGE”) {
error 502 “PURGE on a passed object”;
}
}
Varnish 的详细介绍 :请点这里
Varnish 的下载地址 :请点这里
相关阅读 :
Varnish Cache 的架构笔记 http://www.linuxidc.com/Linux/2013-10/91016.htm
CentOS 5.8 下 Varnish-2.1.5 的安装配置 http://www.linuxidc.com/Linux/2013-09/89916.htm
RedHat 脚本改用 CentOS 源更新安装 Nginx、PHP 5.3、Varnish http://www.linuxidc.com/Linux/2012-07/65801.htm
利用 Varnish 构建 Cache 服务器笔记 http://www.linuxidc.com/Linux/2012-07/65234.htm
缓存服务 Varnish 安装配置 http://www.linuxidc.com/Linux/2012-07/65228.htm
Varnish 编译安装所需准备 http://www.linuxidc.com/Linux/2012-07/65230.htm
Linux 下 Varnish 缓存的配置优化 http://www.linuxidc.com/Linux/2012-03/56435.htm
Varnish 权威指南(中文)PDF http://www.linuxidc.com/Linux/2013-10/91021.htm