Varnish —— CDN加速实现

Varnish的工作原理图:

VCL处理流程:

 

处理过程大致分为如下几个步骤:
(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或
Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进
入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。

 

环境

主机环境:rhel6

实验环境:

主机名IP服务
server1172.25.60.1varnish
server2172.25.60.2apache
server3172.25.60.3apache

 

配置单个后端服务器的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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值