CDN加速的实现-varnish

一、varnish简介

Varnish是一款高性能的开源HTTP加速器,他的作者Poul-Henning Kamp是FreeBSD的内核开发者之一。现在的varnish已经很健壮。很多门户网站已经部署了varnish,并且反应都很好,甚至反应比squid还稳定,且效率更高,资源占用更少。

Varnish工作原理图

 

当varnish上没有缓存时,加速过程是:

client ---> dns ---> cdn ---> server ---> cdn ---> cache --->client

当varnish上有缓存时,加速过程是:

client ---> dns ---> cdn ---> cache  ---> client

二、VCL简介

Varnish  Configuration  Language(VCL)是varnish配置缓存策略的工具,它是一种基于“域”(domain  specific)的简单编程语言,它支持有限的算术运算和逻辑运算操作、允许使用正则表达式进行字符串匹配、允许用户使用set自定义变量、支持if判断语句,也有内置的函数和变量等。使用VCL编写的缓存策略通常保存至.vcl文件中,其需要编译成二进制的格式后才能由varnish调用。

VCL 处理流程图

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

三、varnish的安装

实验主机:172.25.88.1(server1)       varnish

                    172.25.88.2(server2)       apache

                    172.25.88.3(server3)       apache

在server1中:

1、安装varnish

yum   install   varnish-3.0.5-1.el6.x86_64.rpm   varnish-libs-3.0.5-1.el6.x86_64.rpm   -y

2、更改varnish服务端口为80

vim   /etc/sysconfig/varnish

3、更改varnish配置文件

vim   /etc/varnish/default.vcl

backend default {                #配置一个后端服务器
  .host = "172.25.88.2";      #更改访问ip为172.25.88.2
  .port = "80";

4、重新加载服务

在server2中

1、安装apache

yum   install   httpd   -y

2、开启服务

/etc/init.d/httpd    start

3、编写vim  /var/www/html/index.html测试页

4、重新加载服务

5、测试:

在物理机中打开firefox,访问172.25.88.1,看到server2即配置成功。

四、测试缓存命中情况

1、在server1中:

1)更改varnish的配置文件

添加:

# 查看缓存命中情况

编辑vim /etc/varnish/default.vcl

sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";
}
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}

2)重新加载服务

2、测试:

curl  -I   172.25.88.1

第一次显示MISS from westos  cache缓存中没有,前往后端获取

第二次显示HIT  from  westos  cache缓存中直接获取

3、通过varnish手动清除缓存

varnishadm ban.url .*$                                        #清除所有缓存

varnishadm ban.url /index.html                       #清除 index.html 页面缓存

varnishadm ban.url /admin/$                            #清除 admin 目录缓存

这三条命令可根据自己的需求来选择适合的命令来清除varnish服务器的缓存。

使用curl  -I   172.25.88.1访问和使用curl  -I  172.25.88.1/index.html访问,得到的结果一样,但是这两条命令会在缓存区生成两条不同的缓存。

1)server1中执行varnishadm ban.url .*$来清除所有缓存

物理机中curl -I 172.25.88.1 ,发现显示MISS from westos cache

物理机中curl -I 172.25.88.1/index.html两次,使172.25.88.1/index.html缓存到cache中

2)server1中执行varnishadm  ban.url/index.html来清除index.html页面缓存

物理机中curl -I 172.25.88.1/index.html 发现显示MISS from westos cache

注意:

使用curl  -I  172.25.88.1访问和使用curl  -I   172.25.88.1/index.html访问得到的结果一样,但是这两条命令会在缓存区生成两条不同的缓存。

curl -I 172.25.4.1访问的结果中Age表示缓存时间,默认为120s后自动清除,可在/etc/sysconfig/varnish中修改

五、定义多个不同域名点的后端服务器

1、在server1中:

1)更改varnish配置文件

vim /etc/varnish/default.vcl

backend web1 {
  .host = "172.25.88.2";
  .port = "80";
}
backend web2 {
  .host = "172.25.88.3";
  .port = "80";
}

#当访问 www.westos.org 域名时从 web1 上取数据,访问www.linux.org 域名时到 web2 取数据,
访问其他页面报错。
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = web1;
} elsif (req.http.host ~ "^www.linux.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}

2)重新加载服务

/etc/init.d/varnish reload

2、在server2中:

1)编写测试页

vim  /var/www/html/index.html

2)重新加载服务

/etc/init.d/httpd reload

3、在server3中:

1)安装apache,并开启服务

2)编写测试页

vim  /var/www/html/index.html

3)重新加载服务

/etc/init.d/httpd reload

4、在物理机中:

1)添加本地解析:

vim  /etc/hosts

5、测试:

在物理机中打开firefox测试得到相应的文件内容

 

 

测试www.westos.org和westos.org发现两者的结果一样,都是server2中index.html文件中的内容

测试www.linux.org得到的是server3中默认发布文件中的内容

六、定义负载均衡和健康检查

1、在server3中:

1)更改apache配置文件

vim  /etc/httpd/conf/httpd.conf

打开:NameVirtualHost *:80

添加:

<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName www.westos.org
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /www
    ServerName www.linux.org
</VirtualHost>

2)建立/www/index.html

mkdir   /www

vim   /www/index.html

3)重新加载服务

4)配置本地解析

vim  /etc/hosts

5)测试配置是否生效

curl   www.westos.org

curl   www.linux.org得到相应发布文件中的内容

2、在server1中:

1)更改varnish配置

vim /etc/varnish/default.vcl

director lb round-robin {               #把多个后端聚合为一个组,并检测后端健康状况
        { .backend = web1; }
        { .backend = web2; }
}

sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = lb;
return (pass);
} elsif (req.http.host ~ "^www.linux.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}

2)重新加载服务

3)测试:

在物理机中执行curl   www.westos.org得到server2中的index.html中的文件内容

在server1中:

varnishadm ban.url .*$      #清除所有缓存

在物理机中curl   www.westos.org得到server3中的index.html中的文件内容

4)在server1中:

更改varnish配置文件

vim /etc/varnish/default.vcl

sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = lb;
return (pass);                  #为了测试方便,不进行缓存,客户端直接去后端抓取内容
} elsif (req.http.host ~ "^www.linux.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}

重新加载服务

5)测试:

在物理机中执行curl   www.westos.org循环得到server2和server3中index.html文件中的内容

当server2的httpd服务关闭curl www.westos.org会一直读取server3相应的index.html内容而不报错,这是因为varnish拥有自动的健康检查功能,

若开启server2的httpd服务,在物理机中执行curl又能够循环得到server2和server3相应的index.html内容

七、varnish全局配置文件中的参数

1、sysctl -a | grep file                  #查看内核允许的打开文件数的最大值

2、更改varnish配置文件

vim /etc/sysconfig/varnish        #因为内核大于软件,所以修改NFILES

3、更改系统限制文件

vim /etc/security/limits.conf

添加:varnish                 nofile          66656

4、MEMLOCK                   #用多大内存空间保存日志信息

1)更改varnish用户为可交互登陆模式

usermod -s /bin/bash varnish

2)切换到varnish用户,查看系统允许的最大值ulimit  -l

ulimit -a                 #查看所有系统限制

3)更改系统限制文件

 

vim /etc/security/limits.conf

varnish                 memlock         82000

5、NPROCS  #进程核心转储所使用的内存空间,unlimited表示无上限

切换到varnish用户

ulimit -u                               #查看系统允许的最大值

更改系统限制文件

 

vim /etc/security/limits.conf

varnish                 nproc           unlimited

6、还原varnish用户登陆设置

usermod -s /sbin/nologin varnish

7、查看/etc/sysconfig/varnish 里的配置文件

VARNISH_TTL=120                          #联系后端服务器的超时时间

VARNISH_STORAGE_SIZE=1G      #储存的文件的大小

VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin   #基于文件存储时的文件路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值