Varnish的工作原理图:
VCL处理流程:
处理过程大致分为如下几个步骤:
(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或
Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进
入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。
环境
主机环境:rhel6
实验环境:
主机名 | IP | 服务 |
server1 | 172.25.60.1 | varnish |
server2 | 172.25.60.2 | apache |
server3 | 172.25.60.3 | apache |
配置单个后端服务器的Varnish缓存服务器
1. 安装varnish和varnish-lib
[root@server1 ~]# ls
anaconda-ks.cfg varnish-3.0.5-1.el6.x86_64.rpm
install.log varnish-libs-3.0.5-1.el6.x86_64.rpm
install.log.syslog
[root@server1 ~]# yum install varnish-* -y
安装完成后,生成varnish用户,对varnish的访问控制实际上是对varnish用户的访问控制实现的
2. 查看配置文件
[root@server1 sysconfig]# rpm -qc varnish
/etc/logrotate.d/varnish
/etc/sysconfig/varnish ##参数配置文件
/etc/varnish/default.vcl ##主配置文件
3. 查看系统的的最大文件数,要使其大于参数配置文件中的数
[root@server1 mnt]# sysctl -a |grep file
fs.file-nr = 480 0 188466 ##目前系统时用的文件句柄数量
fs.file-max = 188466 ##指定了系统范围内可以打开的文件句柄的最大数量
4. 编辑vim /etc/sysconfig/varnish 参数配置文件
8 NFILES=131072
12 MEMLOCK=82000
15 NPROCS="unlimited"
66 VARNISH_LISTEN_PORT=80
参数配置解释:
NFILES=131072 varnish所能够打开文件的最大个数
MEMLOCK=82000 用多大的内存空间保存日志信息
NPROCS="unlimited" 单个用户运行的线程数
VARNISH_LISTEN_PORT=80 varnish能支持的端口 ##端口80
5. 编辑vim /etc/security/limits.conf文件
作用:因为varnish这个程序运行在varnish这个用户的私有空间内,内核对普通用户的最大文件数有限制,这样做是为了解除Linux系统的最大进程数和最大文件打开数的限制
varnish - nofile 131072
varnish - memlock 82000
varnish - nproc unlimited
6. 编辑vim /etc/varnish/default.vcl VCL的主配置文件,配置后端主机backend-default
7 backend default {
8 .host = "172.25.60.2"; #后端服务器IP
9 .port = "80"; #后端服务器的监听端口
注意:
VCLvanish的所有配置都是通过VCL来配置的。它是一种基于域的简单编程语言,使用VCL编写的缓存策略通常保存在.vcl文件中,其需要编译成二进制的格式后才能由varnish调用。
7. 开启varnish,查看varnish进程
[root@server1 sysconfig]# /etc/init.d/varnish start
[root@server1 sysconfig]# ps aux |grep varnish
cat /proc/1377/status 查看这个varnish进程的信息
- root开启的主进程用来监控,fork子进程
- varnish开启的子进程用来处理用户请求
3.在server2上开启http服务,并编辑/var/www/html/index.html文件
</h1>varnish<h1>
测试:在真机上用curl 172.25.60.1进行测试,可以查看到server2是那个的index.html文件的内容
为了方便观察访问的是后端服务器的index文件,还是varnish缓存服务器上的缓存内容,再次编辑.vcl文件
12 sub vcl_deliver {
13 if (obj.hits > 0) {
14 set resp.http.X-Cache = "HIT from westos.cache";
15 }
16 else {
17 set resp.http.X-Cache = "MISS from westos cache";
18 }
19 return (deliver);
20 }
在客户端访问测试:
- 第一次访问后端apache服务器
- 第二次访问varnish服务器缓存
清除varnish服务器上的缓存
[root@server1 sysconfig]# varnishadm ban.url .*$ #清除所有缓存
[root@server1 sysconfig]# varnishadm ban.url .*$ /indexx.html #清除页面缓存
[root@server1 sysconfig]# varnishadm ban.url .*$ /admin/$ #清除admin 目录缓存
varnish定义多个后端服务器,访问不同域名时,定向到不同的后端
1. 编辑varnish主配置文件/etc/varnish/default.vcl,定义多个后端服务器
7 backend web1 {
8 .host = "172.25.60.2";
9 .port = "80";
10 }
11
12 backend web2 {
13 .host = "172.25.60.3";
14 .port = "80";
15 }
16
#当访问以www开头或者多个www开头westos.org域的域名时,访问后端web1
#当访问以bbs开头或者多个bbs开头westos.org域的域名时,访问后端web2
#其他情况下页面出错
17 sub vcl_recv {
18 if (req.http.host ~ "^(www.)?westos.org") {
19 set req.http.host = "www.westos.org";
20 set req.backend = web1;
21 }elsif (req.http.host ~ "^bbs.westos.org") {
22 set req.backend = web2;
23 } else {
24 error 404 "westos cache";
25 }
26 }
27
28 sub vcl_deliver {
29 if (obj.hits > 0) {
30 set resp.http.X-Cache = "HIT from westos.cache";
31 }
32 else {
33 set resp.http.X-Cache = "MISS from westos cache";
34 }
35 return (deliver);
36 }
在真机上添加域名解析后进行测试:
172.25.60.1 www.westos.org bbs.westos.org
varnish实现后端服务器的负载均衡
1. 编辑服务的配置文件,以轮询方式实现负载均衡
7 backend web1 {
8 .host = "172.25.60.2";
9 .port = "80";
10 }
11
12 backend web2 {
13 .host = "172.25.60.3";
14 .port = "80";
15 }
16
17 director lb round-robin {
18 {.backend = web1;}
19 {.backend = web2;}
20 }
#当访问www.westos.org时以轮询的方式实现负载均衡
#当访问bbs.westos.org时访问后端web2
21 sub vcl_recv {
22 if (req.http.host ~ "^(www.)?westos.org") {
23 set req.http.host = "www.westos.org";
24 set req.backend = lb;
25 return (pass);
26 }elsif (req.http.host ~ "^bbs.westos.org") {
27 set req.backend = web2;
28 } else {
29 error 404 "westos cache";
30 }
31 }
测试:在客户端访问www.westos.org