企业级cdn搭建varnish服务器

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]# vi 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的路径写错了。
这里写图片描述

<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 restart
[root@server2 /]# /etc/init.d/varnish start

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。 这时直接在物理端进行测试是没有效果的,效果如下图所示:
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/wangkana/article/details/81639006