一、概念
1、Varnish 是什么
Varnish是高性能开源的反向代理服务器和HTTP缓存服务器
Varnish的功能与Squid服务器相似,都可以用来做HTTP缓存
Squid是从硬盘读取缓存的数据,而Varnish把数据存放在内存中,直接从读取内存,避免了频繁在内存、磁盘中交换文件,
优点:Varnish要相对更高效,
缺点:内存中的缓存在服务器重启后会丢失
2、Varnish 如何工作
1)初始化过程
Varnish 的master进程负责启动工作,master进程读取配置文件,根据指定的空间大小(例如管理员分配了2G内存)来创建存储空间,创建并管理child进程
child进程来处理后续任务,它会分配一些线程来执行不同的工作,例如
接受http请求
为缓存对象分配存储空间
清除过期缓存对象
释放空间 碎片整理
2)http请求处理过程
有一个专门负责接收http请求的线程,一直监听请求端口,当有请求过来时,负责唤起一个工作线程来处理请求
工作线程会分析http请求的uri,知道了这个请求想要什么,就到缓存中查找是否有这个对象
如果有,就把缓存对象直接返回给用户
如果没有,会把请求转给后端服务器处理,并等待结果,工作线程从后端得到结果内容后,先把内容作为一个缓存对象保存到缓存空间(以备下次请求这个对象时快速响应),然后再把内容返回给用户
3)分配缓存过程
有一个对象需要缓存时,根据这个对象的大小,到空闲缓存区中查找大小最适合的空闲块,找到后就把这个对象放进去
如果这个对象没有填满这个空闲块,就把剩余的空间做为一个新的空闲块
如果空闲缓存区中没地方了,就要先删除一部分缓存来腾出地方,删除是根据最近最少使用原则
4)释放缓存过程
有一个线程来负责缓存的释放工作,他定期检查缓存中所有对象的生存周期,如果某个对象在指定的时间段内没有被访问,就把这个对象删除,释放其占用的缓存空间
释放空间后,检查一下临近的内存空间是否是空闲的,如果是,就整合为一个更大的空闲块,实现空间碎片的整理
二、配置
1、配置varnish
server1 server2 server3
varnish代理服务 阿帕奇服务 阿帕奇服务
172.25.47.1 172.25.47.2 172.25.47.3
1)server1(代理)上
yum install openssh-clients -y
从真机scp varnish包
cd varnish/
yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y
rpm -qc varnish-3.0.5-1.el6.x86_64 ##查看配置文件
vim /etc/sysconfig/varnish
8 NFILES=131072 ##打开文件最大数
12 MEMLOCK=82000 ##需要内存
15 NPROCS="unlimited" ##进程数
66 VARNISH_LISTEN_PORT=80 ##改端口为80,因为服务器端口号是80
vim /etc/varnish/default.vcl
8 .host = "172.25.47.2"; ##修改代理地址
9 .port = "80";
vim /etc/security/limits.conf
51 varnish - nofile 131072 ##在最后添加
52 varnish - memlock 82000
53 varnish - nproc unlimited
/etc/init.d/varnish restart ##重启,第一次重启可能会出错,再次重启就好了
netstat -antlp |grep 80 ##查看端口是否开启
2)server2(服务器)上
yum install httpd -y
cd /var/www/html/
vim index.html
写一个发布页
/etc/init.d/httpd restart
测试: 在真机curl 172.25.47.1,可以通过server1代理到server2
2、查看是否命中缓存
server1
vim /etc/varnish/default.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 }
/etc/init.d/varnish reload ##此处用reload刷新,如果restart,缓存就会清掉
vim /etc/sysconfig/varnish
82 VARNISH_THREAD_TIMEOUT=120 ##缓存保留时间是120s
varnishadm ban.url .*$ ##清除缓存。访问路径后面的所有都清空
varnishadm ban.url /index.html ##清除缓存,清楚访问路径后面的所有都清空
测试:
真机curl -I 172.25.47.1
MISS ##表示没命中
再次curl -I 172.25.47.1
HIT ##表示命中
3、定义不同域名的ip,访问到不同的后端主机(是在七层协议中的应用层做的)
server1:
vim /etc/varnish/default.vcl
7 backend web1 {
8 .host = "172.25.47.2";
9 .port = "80";
10 }
11
12 backend web2 {
13 .host = "172.25.47.3";
14 .port = "80";
15 }
16
17 sub vcl_recv {
18 if(req.http.host ~"^(www.)?westos.org"){ ##访问以www.westos.org或者westos.com 访问到web1
19 set req.http.host = "www.westos.org"; ##访问
20 set req.backend = web1; ##访问web1
21 }elsif (req.http.host ~"^bbs.westos.org"){
22 set req.backend = web2; ##访问到web2
23 }else {
24 error 404 "error"; ##如果是没有的服务,返回error
25 }
26
27 }
/etc/init.d/varnish restart
在server2
vim index.html
server2:www.westos.org
/etc/init.d/httpd restart
在server3
yum install httpd -y
cd /var/www/html/
vim index.html
server3:bbs.westos.org
/etc/init.d/httpd restart
在真机 vim /etc/hosts
172.25.47.1 server1 www.westos.org bbs.westos.org westos.org
curl westos.org
curl www.westos.org
看到的是server2服务
curl bbs.westos.org
看到的是server3服务
curl 172.25.47.1
看到的是错误404
3、负载均衡
在server3上
mkdir /www ##创建虚拟主机
cd /www/
vim index.html
www
mkdir /bbs
cd /bbs/
vim index.html
bbs
vim /etc/httpd/conf/httpd.conf
990 NameVirtualHost *:80
1003 <VirtualHost *:80>
1004 DocumentRoot /www
1005 ServerName www.westos.org
1006 </VirtualHost>
1007
1008 <VirtualHost *:80>
1009 DocumentRoot /bbs
1010 ServerName bbs.westos.org
1011 </VirtualHost>
/etc/init.d/httpd restart
在server1
vim /etc/varnish/default.vcl
17 director lb round-robin{ ##写轮询
18 { .backend = web1;}
19 { .backend = web2;}
20 }
21
22 sub vcl_recv {
23 if(req.http.host ~"^(www.)?westos.org"){
24 set req.http.host = "www.westos.org";
25 set req.backend = lb;
26 return (pass); ##不缓存
27 }elsif (req.http.host ~"^bbs.westos.org"){
28 set req.backend = web2;
29 }else {
30 error 404 "error";
31 }
32
33 }
/etc/init.d/varnish reload
varnishadm ban.url .*$
在真机中:
curl www.westos.org
轮询
curl bbs.westos.org
4、推送平台
推送平台就是一个展示在前端的服务,可以直接在平台上进行对后端程序的操作,而不需要用命令去执行
在server1上
yum install unzip php httpd -y
unzip bansys.zip -d /var/www/html/
mv /var/www/html/bansys/* /var/www/html/
cd /var/www/html/
ls
vim config.php
1 <?php
2 //varnish主机列表
3 //可定义多个主机列表
4 $var_group1 = array(
5 'host' => array('172.25.47.1'),
6 'port' => '8080',
7 );
8
9
10
11 //varnish群组定义
12 //对主机列表进行绑定
13 $VAR_CLUSTER = array(
14 'www.westos.org' => $var_group1,
15 'cdn.ywjt.org' => $var_group1,
16 );
vim /etc/httpd/conf/httpd.conf
136 Listen 8080
/etc/init.d/httpd restart
vim /etc/varnish/default.vcl
7 acl westos {
8 "127.0.0.1";
9 "172.25.47.0"/24;
10 }
11
12 backend web1 {
13 .host = "172.25.47.2";
14 .port = "80";
15 }
16
17 backend web2 {
18 .host = "172.25.47.3";
19 .port = "80";
20 }
21
22 director lb round-robin{
23 { .backend = web1;}
24 { .backend = web2;}
25 }
26
27 sub vcl_recv {
28 if (req.request == "BAN") {
29 if (!client.ip ~ westos) {
30 error 405 "Not allowed.";
31 }
32 ban("req.url ~ " + req.url);
33 error 200 "ban added";
34 }
35 }
36 sub vcl_recv {
37 if(req.http.host ~"^(www.)?westos.org"){
38 set req.http.host = "www.westos.org";
39 set req.backend = lb;
40 #return (pass);
41 }elsif (req.http.host ~"^bbs.westos.org"){
42 set req.backend = web2;
43 }else {
44 error 404 "error";
45 }
46
47 }
48
49 sub vcl_deliver {
50 if (obj.hits>0){
51 set resp.http.X-Cache = "HIT from westos cache";
52 }
53 else {
54 set resp.http.X-Cache = "MISS from westos cache";
55 }
56 return (deliver);
57 }
/etc/init.d/varnish reload
varnishadm ban.url .*$
/etc/init.d/httpd restart
真机
在firefox中http://172.25.47.1:8080
要选择http
真机
curl www.westos.org/index.html
推送/index.html
真机
curl www.westos.org/index.html
可以看到缓存被清了