Linux下的Varnish

一.Varnish的基本了解

(1)varnish是一款高性能的开源HTTP加速器,varnish访问速度更快所有缓存数据都直接从内存读取,Varnish可以支持更多的并发连接,Varnish是通过fork

形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求。但是varnish进程一旦Hang、Crash或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成

很大压力。在varnish使用中如果单个url的请求通过HA/F5(负载均衡)每次请求不同的varnish服务器中,被请求varnish服务器都会被穿透到后端,而且同样的请求会在多台服务器上缓存,也会造成varnish的缓存的资源浪费,也会造成性能下降。

(2)基本模块:

lookup:表示在缓存里查找被请求的对象,并且根据查找的结果把控制权交给函数

vcl_hit或者函数vcl_miss。

vcl_recv模块:用于接收和处理请求。当请求成功被调用后,Varnish通过判断请求的数据来决定如何处理请求。

vcl_pipe模此:模块在请求进入pipe模式时被调用,用于将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,也就是在当前连接未关闭时,服务器将不变的内容返回给客户端,直到该连接被关闭。

vcl_pass模块:此模块表示当请求被pass后,用于将请求直接传递至后端应用服务器。后端应用服务器在接收请求后将数据发送给客户端,但不进任何数据的缓存,在当前连接下每次都返回最新的内容。

vcl_hit模块:执行lookup指令后,Varnish在缓存中找到请求的内容后将自动调用该模块,在此模块中,deliver表示将找到的数据发送给客户端,把控制权交给vcl_deliver模块。

vcl_miss模块:执行lookup后,Varnish在缓存中没有找到请求的内容时会自动调用该方法。此模块可以用于判断是否需要从后端服务器获取内容。在此模块中,fetch表示从后端获取请求的数据,并把控制权交给vcl_fetch模块。

vcl_fetch模块:在后端主机更新缓存并且获取内容后调用该方法,接着,通过判断获取的内容来决定是将内容放入缓存,还是直接返回给客户端。

vcl_deliver模块:当一个没有被缓存的数据交付给客户端的时候被调用。

vcl_discard模块:在缓存数据到期后或缓存空间不够时,自动调用该模块。在此模块中keep表示将数据继续保留在缓存中。

二.Varnish的配置(实验环境:Linux-redhat6.5版本,Varnish的安装包要从官网下载

1.一个后端服务器

varnish IP(server1):172.25.78.1,web1 IP(server2):172.25.78.2,web2 IP(server2):172.25.78.3,客户端 IP:172.25.78.250)

(1)varnish的配置

/etc/sysconfig/varnish   ##varnish的配置文件

修改varnish最大打开文件的个数为65535

Linux下的Varnish

设置varnish的监听端口为80

Linux下的Varnish

vim /etc/security/limit.conf    ##Linux系统对用户资源的限制,添加varnish的文件开启最大数目的配置

Linux下的Varnish

sysctl -a  | grep   file   ##系统最大允许开启的文件个数为98866个

Linux下的Varnish

vim /etc/varnish/default.vcl      ##配置一个后端服务器

/etc/init.d/varnish  start   ##启动varnish服务

/etc/init.d/varnish  reload   ##更新配置文件

Linux下的Varnish

###查看缓存命中的情况的配置

Linux下的Varnish

(2)web服务的默认发布目录

Linux下的Varnish

(3)测试:

/etc/hosts   ##客户端配置本地解析

Linux下的Varnish

curl -I   域名|IP       ##仅显示请求头信息

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

当第一次访问的时候,www.westos.com域名的信息,还没有在varnish上面缓存,所以显示‘MISS’,然后进入fetch状态对后端请求,请求得到的域名信息,首先在varnish上面存储,之后把信息返回给客户端

Linux下的Varnish

当再次访问同样的域名,varnish首先执行Lookup在本地查找,找到之前存储的www.westos.com请求信息,就直接返回给客户端,显示‘HIT’,不用再去后端服务器请求

Linux下的Varnish

2.定义多个不同域名的后端服务器

(1)vim /etc/varnish/default.vcl      ##配置2个后端服务器

Linux下的Varnish

Linux下的Varnish

(2)web服务器(server3 IP:172.25.78.3) 

server3的默认发布文件

Linux下的Varnish

(3)测试:

客户端本地解析

Linux下的Varnish

成功访问bbs.westos.com

Linux下的Varnish

172.25.78.1没有添加到varnish存储中,404报错

Linux下的Varnish

3.健康检查

vim /etc/varnish/default.vcl  

director lb round-robin{          ##把多个后端聚合为一组,并检查后端健康状况

{.backend=web1;}

{.backend=web2;}

}

关闭server2的web服务

测试:停掉server2的web服务后,只能检测到server3的发布文件

Linux下的Varnish

三.CDN推送(内容分发网络)

     CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。

实验环境:在官网下载安装包(varnish-php-bansys),此外还要安装php,因为使用php写的软件

(1)解压安装包到/var/www/html/varnish/config.php         ###做如下配置

Linux下的Varnish

在varnish主机上安装http服务端口使用8080,避开varnish的80端口,以免冲突

Linux下的Varnish

(2)测试,成功推送

Linux下的Varnish

Linux下的Varnish