varnish简要介绍:
Varnish是一款高性能、开源的反向代理服务器和缓存服务器。Varnish使用内存缓存文件来减少响应时间和网络带宽消耗。
varnish 和squid的区别:
-
Varnish访问速度更快,Varnish采用了“Visual Page Cache”技术,所有缓存数据都直接从内存读取,而squid是从硬盘读取,因而Varnish在访问速度方面会更快。(所以说varnish有个缺点,当varnish进程一旦被down,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力。)
-
Varnish可以支持更多的并发连接,因为Varnish的TCP连接释放要比Squid快。因而在高并发连接情况下可以支持更多TCP连接。
-
Varnish可以通过管理端口,使用正则表达式批量的清除部分缓存,而Squid是做不到的。
-
squid属于是单进程使用单核CPU,但Varnish是通过fork形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求。
事实上,varnish整体的性能将会高于squid; -
进程
- 主进程Manager - 子进程......
-
函数
vcl_recv
在请求开始时候被调用,在请求已经被接收到并且解析后调用。目的就是决定是否处理这个请求,怎么处理,使用哪个后端。
vcl_recv以return结束,参数可以为如下关键字:
error code [reason]:返回错误码给客户端,丢弃请求。
pass:转换到pass模式。控制权最后会转移到vcl_pass。
pipe:转换到pipe模式。控制权最后会转移到vcl_pipe。
lookup:在缓存中寻找请求对象。控制权最后会转移到vcl_hit或者vcl_miss,决定于对象是否在缓存中.
vcl_pass
当进入pass模式的时候会被调用。在这个模式中,请求会被传送到后端,然后后端的响应会被传送回客户端,但是响应不会进入缓存中。接下来通过相同客户端连接发起的请求会以普通的方式来处理。vcl_pass以return结束,参数可以为如下关键字:
error code [reason]:返回错误码给客户端,丢弃请求。
pass:以pass模式执行。
vcl_hash
你如果把想把数据加入到hash中,那么调用hash_data()。vcl_hash以return结束,参数可以为如下关键字:
hash:执行hash逻辑。
vcl_hit
如果请求的对象在缓存中被找到了,那么在缓存查找结束后被调用。vcl_hit以return结束,参数可以为如下关键字:
deliver:deliver缓存对象到客户端。控制权最后会转移到vcl_deliver。
error code [reason]:返回错误码给客户端,丢弃请求。
pass:切换到pass模式。控制权最后会转移到vcl_pass。
vcl_miss
如果请求的对象在缓存中没有被找到,那么在缓存查找结束后被调用。目的是为了决定是否去后端获取这个请求对象,并且要选择哪个后端。vcl_miss以return结束,参数可以为如下关键字:
error code [reason]:返回错误码给客户端,丢弃请求。
pass:切换到pass模式。控制权最后会转移到vcl_pass。
fetch:去后端获取请求对象。控制权最后会转移到vcl_fetch。
vcl_fetch
当一个对象被成功从后端获取的时候此方法会被调用。vcl_fetch以return结束,参数可以为如下关键字:
deliver:可能把对象放入缓存中,然后再deliver到客户端。控制权最后会转移到vcl_deliver。
error code [reason]:返回错误码给客户端,丢弃请求。
esi:以ESI形式来处理刚刚被获取到的对象。
pass:切换到pass模式。控制权最后会转移到vcl_pass。
大致的过程如下描述:
当客户端进行请求,vcl_crecv这个函数接受了进程,根据VCL规则请求应该是pass或Pipe,或者进入Lookup状态;
Lookup状态,判断是否是可缓存数据在cash中(执行lookup指令),调用hash函数,默认url做key。然后问cash,如果它在缓存中找到请求的内容自动调用cvl_hti函数,再将控制权交给函数vcl_deliver,它将客户所需要的数据,直接返回给客户;反之,如果在cash中未命中,自动调用vcl_miss函数,再将控制权交给vcl_fetch函数,从后端服务器上更新缓存,再去调用vcl_deliver函数,从缓存中找到请求,返回给客户端;
如果是Pass状态进入后端请求,调用vcl_fetch函数,到后端服务器直接抓取数据;
如果是pipe(管道方式,后续请求与varnish无关)直接让client和server直接通信,如果一旦通信结束,立即释放;(pass与其最大的区别在于在后续请求中依旧与varnish环境中)
sysctl -a 与 ulimit -a
- sysctl -a 是 内核参数设置
- ulimit -a 显示各用户进程限制
varnish搭建
主机环境:rhel6.5 selinux 和iptables 都必须是disabled状态
实验主机:
172.25.74.2 varnish ( server2 )
172.25.74.3 appache ( server3 )
172.25.74.4 appache ( server4 )
实验操作:
A:配置一个后端服务器
1、首先在server2(主机名:server2)中下载varnish的两个rpm包
[root@server2 ~]# yum install varnish-libs-3.0.5-1.el6.x86_64.rpm varnish-3.0.5-1.el6.x86_64.rpm -y ## server2安装varnish
[root@server2 varnish]# /etc/init.d/varnish start ##开启服务
Starting Varnish Cache: [ OK ]
2、改变varnish监听端口,进行varnish的系统环境设置,即varnish用户的限制;
[root@server2 ~]# vi /etc/sysconfig/varnish ##改变varnish监听端口
[root@server2 ~]# vim /etc/security/limits.conf
3、在server3(主机名 : server3)中安装appache软件,开启服务,编辑默认发布文件index.html;
[root@server3 ~]# yum install httpd -y
[root@server3 ~]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.74.3 for ServerName
[ OK ]
[root@server3 ~]# cd /var/www/html
[root@server3 html]# vim index.html
4、修改varnish配置文件
[root@server2 ~]# cd /etc/varnish
[root@server2 varnish]# vi default.vcl
[root@server2 varnish]# /etc/init.d/varnish reload ##重新加载
5、需要在物理机的浏览器进行查询,设置本地解析,在浏览器查询;
[root@foundation74 ~]# vim /etc/hosts
B:配置后端服务器,并查看缓存命中情况;
[root@server2 varnish]# vim default.vcl ##修改配置文件
[root@server2 varnish]# /etc/init.d/varnish reload
C:varnishadm 手动清除缓存
varnishadm ban.url .*$ #清除所有
varnishadm ban.url /index.html #清除 index.html 页面缓存
varnishadm ban.url /admin/$ #清除 admin 目录缓存
D:定义多个不同域名站点的后端服务器
1、首先开启server4(主机名:server4)虚拟机,并下载httpd,开启服务,编辑默认发布文件;
[root@server4 ~]# yum install httpd -y
[root@server4 ~]# /etc/init.d/httpd start
[root@server4 ~]# /etc/init.d/httpd start
[root@server4 html]# vi index.html
2、在server2中修改varnish配置文件
[root@server2 varnish]# vim default.vcl
[root@server2 varnish]# /etc/init.d/varnish reload
3、在物理机添加本地解析:
[root@foundation74 Desktop]# vim /etc/hosts
4、测试:
E:定义负载均衡
1、在server4中修改httpd的配置文件,打开基于域名的虚拟主机;
[root@server4 html]# mkdir /www1
[root@server4 html]# cd www1
[root@server4 www1]# vi index.html
[root@server4 www1]# vi /etc/httpd/conf/httpd.conf ##编辑主配置文件
[root@server4 html]# /etc/init.d/httpd restart ##重启服务
2、在server3中,修改默认发布文件(为了跟server4的区分开)
[root@server3 html]# vim index.html
3、在server2配置文件修改;
[root@server2 varnish]# vim default.vcl
[root@server2 varnish]# /etc/init.d/varnish reload
4、物理机测试:
附:
实验过程中遇到的问题
在作定义负载均衡实验中,测试出现如下的错误: 因为在server4中在/etc/httpd/conf/httpd.conf中把www.westos.org的路径写错了。 ![这里写图片描述](https://img-blog.csdn.net/20180814000211813?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdrYW5h/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) |
<VirtualHost *:80>
DocumentRoot /var/www/html/www1 ##错误,正确为/www1
ServerName www.westos.org
</VirtualHost>
F:创建缓存递送平台,定点清除后端数据(业务的数据更新);
server3、server4启动http服务:
[root@server3 ~]# /etc/init.d/httpd start
[root@server4 ~]# /etc/init.d/httpd start
server2:
1、下载bansys.zip,并进行解压;
[root@server2 varnish]# yum install -y unzip
[root@server2 varnish]# unzip bansys.zip -d /var/www/html ##-d指定解压的路径
2、安装http,编辑配置文件
[root@server2 /]# yum install httpd -y
[root@server2 /]# yum install vim -y ##下载编辑工具vim
[root@server2 /]# vim /etc/httpd/conf/httpd.conf
[root@server2 /]# /etc/init.d/httpd start
[root@server2 /]# /etc/init.d/varnish reload
3、安装php
[root@server2 /]# yum install php -y
4、编辑发布内容(php格式);
[root@server2 /]# cd /var/www/html/bansys/
[root@server2 bansys]# mv * ..
[root@server2 bansys]# cd ..
[root@server2 html]# ls
bansys class_socket.php config.php index.php purge_action.php static
[root@server2 html]# vim config.php
[root@server2 html]# /etc/init.d/httpd restart
[root@server2 html]# netstat -antlp ##当前可以看到8080端口修改成功;
tcp 0 0 :::8080 :::* LISTEN 1419/httpd
tcp 0 0 :::80 :::* LISTEN 1285/varnishd
[root@server2 html]# cd /etc/varnish
[root@server2 varnish]#vim default.vcl
[root@server2 varnish]# /etc/init.d/varnish reload
Loading vcl from /etc/varnish/default.vcl
Current running config name is boot
Using new config name reload_2018-07-30T10:06:07
VCL compiled.
available 0 boot
active 0 reload_2018-07-30T10:06:07
Done
5、在浏览器打开172.25.74.2:8080,页面,进入php格式:
在物理机进行测试:
附:
操作过程中遇到的问题:
问题1:如果在网页上输入172.25.45.1:8080,进入php 的CDN推送管理,如果遇到推送失败的问题,可能的原因是推送模式不对应。应该选用HTTP模式; |
该模式是通过HTTP来执行purge。它发送一个HTTP头部信息给Varnish,这种执行purge的方式支持正则。设置VCL如下:(3.x版本使用ban)
问题2:在推送内容输入的如果不是/index.html,而是http://www.westos.org/index.html。 这时直接在物理端进行测试是没有效果的,效果如下图所示: ![这里写图片描述](https://img-blog.csdn.net/20180814002312426?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdrYW5h/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) ![这里写图片描述](https://img-blog.csdn.net/20180814002322671?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdrYW5h/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) |