Linux 下Varnish 服务的部署

Linux 下Varnish 服务的部署

varnish 简介:

Varnish 是一款高性能、开源的反向代理服务器和缓存服务器。Varnish 使用内存缓存文件来减少响应时间和网络带宽消耗。这个项目是由挪威的一家报纸 Verdens Gang 的网络分支起始的,其架构设计和开发总监 Poul-Henning Kamp 是FreeBSD 核心的开发人员之一,最初项目的管理与基础设施及额外开发由挪威一家 Linux咨询公司 Linpro提供。

说到varnish,squid 就不得不提及。squid 算得上是古老的缓存服务器。由于varnish先进的设计理念,性能要比squid高上许多 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。,varnish还可以通过端口进行管理,使用正则语句做到清除指定缓存的功能,这些squid都做不到。但是varnish在高并发的情况下,资源消耗较高,而且varnish服务进程一旦崩溃,重启,内存中的缓存数据将全部丢失。

varnish官方网站:https://www.varnish-cache.org/

Varish 的工作流程

Varnish处理HTTP请求的过程大致分为如下几个步骤:

Receive状态,也就是请求处理的入口状态,根据VCL规则判断该请求应该Pass或Pipe,还是进入Lookup(本地查询)。
Lookup状态,进入此状态后,会在hash表中查找数据,若找到,则进入Hit状态,否则进入miss状态。
Pass状态,在此状态下,会进入后端请求,即进入Fetch状态。
Fetch状态,在Fetch状态下,对请求进行后端获取,发送请求,获得数据,并进行本地存储。
Deliver状态, 将获取到的数据发送给客户端,然后完成本次请求。

在这里插入图片描述

图中椭圆形部分称为varnish的状态节点,又称为状态引擎,还有种叫法为varnish的内置函数。
图中红色的线条:没有查询缓存/缓存中数据过期/缓存中没有数据 情况下的流程
图中橙黄色的线条:直接将匹配数据通过内置函数vcl_pipe送往后台主机的流程
图中绿色的线条:查询缓存数据命中且数据没有过期/经后台主机返回的数据经被缓存后返回给客户流程
图中蓝色的线条:数据没有命中缓存向后台主机发出查询的流程 图中黑色的线条:数据从后台主机返回给varnish缓存的流程

Varnish 的基本配置

Varish 安装

准备安装包进行安装 执行命令进行安装

[root@Server1 mnt]# cd /mnt/
 [root@Server1 mnt]# ls     # 此目录下有 varnish 所需安装包
 varnish-3.0.5-1.el6.x86_64.rpm  varnish-libs-3.0.5-1.el6.x86_64.rpm
 [root@Server1 mnt]# rpm -ivh varnish-*     # 通过 rpm 命令进行安装

进行配置

Varnish 的主要配置文件,及其说明

 NFILES=131072       --->打开的最大文件数,varnish 自动调整该值

 MEMLOCK=82000       --->内存中共享日志空间的大小
 NPROCS="unlimited"  --->单个用户运行的线程数
 RELOAD_VCL=1        --->设置为1 ,表示随着varnish的重启自动状态vcl策略配置文件
 VARNISH_VCL_CONF=/etc/varnish/default.vcl   --->默认vcl策略文件的位置
 VARNISH_LISTEN_PORT=80                      --->varnish监听的端口,默认为 6081
 VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1      --->varnish提供telnet管理端口监听的地址
 VARNISH_ADMIN_LISTEN_PORT=6082              --->varnish提供telnet管理端口监听的端口   VARNISH_SECRET_FILE=/etc/varnish/secret      --->varnish为管理端口提供的共享密钥文件 
 VARNISH_MIN_THREADS=50                      --->varnish启动时启动最少的线程数
 VARNISH_MAX_THREADS=1000                    --->varnish启动时启动最多的线程数   VARNISH_THREAD_TIMEOUT=120             --->varnish线程数的空闲时间,超过该时间自动销毁线程

 VARNISH_STORAGE_MEM=100M               --->使用内存为存储设备时使用的空间大小

 VARNISH_STORAGE="malloc,${VARNISH_STORAGE_MEM}"                               

   --->当varnish后端存储的配置,使用内存用来缓存数据,大小为100M

VARNISH_TTL=120   
DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
             -f ${VARNISH_VCL_CONF} \
             -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
             -t ${VARNISH_TTL} \
             -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \
             -u varnish -g varnish \
             -S ${VARNISH_SECRET_FILE} \
             -s ${VARNISH_STORAGE}"

对Varnish 进行配置

/etc/sysconfig/varnish 中规定了

NFILES=131072 # 打开的最大文件数
MEMLOCK=82000 # 内存中共享日志空间的大小
NPROCS=”unlimited” # 单个用户运行的线程数

将这些数据写入/etc/security/limits.conf 中
/etc/security/limits.conf 这个文件主要是用来限制用户对系统资源的使用,具体的使用方法 man 5 limits.conf,里面便给出了详细的用法

[root@Server1 mnt]# vim /etc/security/limits.conf
内容如下:
在文件最后添加:

  #End of file
 varnish     -    nofile   131072 
 varnish     -    memlock  82000
 varnish     -    nproc    unlimited

在这里插入图片描述
编辑 /etc/sysconfig/varnish

将varnish监听的端口从6081 改为80

 [root@Server1 mnt]# vim /etc/sysconfig/varnish 
 编辑第 66 行
  65 # VARNISH_LISTEN_ADDRESS=
  66 VARNISH_LISTEN_PORT=80
  67 #
  68 # # Telnet admin interface listen address and port

在这里插入图片描述
编辑 /etc/varnish/default.vcl
编辑此文件 添加 Apache 服务器,和进行 vcl 规则配置

 [root@Server1 mnt]# vim /etc/varnish/default.vcl
 编辑如下: 
   # 编辑后段服务器:
   7 backend default {
   8   .host = "172.25.21.2";    # 服务器 ip
   9   .port = "80";
  10 } 
  11 
   # 查看缓存命中情况 
  12 sub vcl_deliver {
  13 if (obj.hits > 0) {
  14         set resp.http.X-Cache = "HIT from test cache";
  15 }       
  16 else {
  17         set resp.http.X-Cache = "MISS from test cache";
  18 }       
  19 return (deliver);
  20 }

配置完成,重启服务,并加载varnish 规则

 [root@Server1 mnt]# /etc/init.d/varnish restart  # 重启服务
 [root@Server1 mnt]# /etc/init.d/varnish reload   # 重新加载规则

在这里插入图片描述

进行apacha 服务器的安装配置

执行命令进行httpd 服务的安装

 [root@Server2 ~]# yum install httpd - y  # httpd 服务安装
 [root@Server2 ~]# vim /var/www/html/index.html 
                 # 编辑默认发布文件

在这里插入图片描述
在服务端进行测试
修改服务端本地域名解析

 [root@foundation21 ~]# vim /etc/hosts
 编辑内容如下:
  172.25.15.1 www.test.com  nba.test.com    # 将 varnish 服务器的域名加上

在服务器端进通过浏览器访问 Apache 服务器
访问 Apache 服务器的 ip

我们的 varnish 服务器上是没有安装 Apache 服务的,而我们可以通过访问 varnish 服务而访问到 172.25.15.2 Apache 服务器的内容,这就是varnish 的作用之一,进行转发

我们可以通过 crul 命令来查看通过 varnish 对 HTTP 服务器内容的cache效果
执行:

 [root@foundation21 ~]# curl www.test.com -I  通过 varnish 服务器的域名进行访问
 HTTP/1.1 200 OK
 Server: Apache/2.2.15 (Red Hat)  # 服务器
 Last-Modified: Sat, 28 Jul 2018 08:04:44 GMT
 ETag: "9fa0b-20-5720aae603b9e"
 Content-Type: text/html; charset=UTF-8   # 文本类型
 Content-Length: 32          # 文本长度
 Accept-Ranges: bytes
 Date: Sat, 28 Jul 2018 08:59:26 GMT
 X-Varnish: 653942394    # varinsh 服务器
 Age: 0                  # 有效时间
 Via: 1.1 varnish        # 版本
 Connection: keep-alive  # 连接情况
 X-Cache: MISS from test cache  # cache情况
                                # 由于是第一次进行cache,需要从http 服务器端获取数据

多个不同域名站点的后端服务器的配置

新建第二个 Apache 服务器
执行命令进行httpd 服务的安装

 [root@Server3 ~]# yum install httpd -y  # httpd 服务安装
 [root@Server3 ~]# vim /var/www/html/index.html 
                 # 编辑默认发布文件

在varnish 服务器进行配置

编辑 /etc/varnish/default.vcl

 [root@Server1 mnt]# vim /etc/varnish/default.vcl
  编辑内容如下:
  8 backend web1 {        # 第一个后端服务器
  9   .host = "172.25.21.2";
 10   .port = "80";
 11 }
 12 backend web2 {        # 第二个后端服务器
 13   .host = "172.25.21.3";
 14   .port = "80";
 15 }
 16 
 17 
 18 
 19 
 #当访问 www.test.com 域名时从 web1 上取数据,访问 nba.test.com 域名时到 web2 取数据,
 #访问其他页面报错。
 20 sub vcl_recv {
 21 if (req.http.host ~ "^(www.)?test.com") {
 22         set req.http.host = "www.test.com";
 23         set req.backend = web1;
 24         
 25 } elsif (req.http.host ~ "^nba.test.com") {
 26         set req.backend = web2;
 27 } else {
 28         error 404 "test cache";
 29 }       
 30 }

在这里插入图片描述
在这里插入图片描述

编辑完成重新加载varnish配置

 [root@Server1 mnt]# /etc/init.d/varnish restart
 [root@Server1 mnt]# /etc/init.d/varnish reload

在这里插入图片描述

在客户端进行测试
修改服务端本地域名解析

 [root@foundation21 ~]# vim /etc/hosts
 编辑内容如下:
  172.25.21.1 www.test.com  nba.test.com    # 将 varnish 服务器的域名加上

进行测试

 [root@foundation21 ~]# curl www.test.com    # 对服务器1进行访问
 <h1>www.test.com - server2<h1/>       # 默认发布文件内容
 [root@foundation21 ~]# curl nba.test.com    # 对服务器2进行访问
 nba.test.com                          # 默认发布文件内容
 [root@foundation21 ~]# curl sss.test.com    # 对未知服务器进行访问
 <html>                                   
 <head><title>302 Found</title></head>
 <body bgcolor="white">
 <center><h1>302 Found</h1></center>
 <hr><center>nginx/1.13.12</center>
 </body>
 </html>

健康检查与负载均衡

    varnish可以对后端主机进行健康检测,动态进行移除或恢复后端主机调度列表
        .probe:定义健康状态检测方法
        .url:检测时请求的URL,默认为”/”;
        .request:发出的具体请求;
        .request =
        “GET /.healthtest.html HTTP/1.1”
        “Host: www.magedu.com”
        “Connection: close”
        .window:基于最近的多少次检查来判断其健康状态;
        .threshhold:最近.window中定义的这么次检查中至有.threshhold定义的次数是成功的;
        .interval:检测频度;
        .timeout:超时时长;
        .expected_response:期望的响应码,默认为200;

负载均衡
英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
varnish 的负载均衡可浅显的理解为,将一个服务器上的信息分摊到多个服务器上,防止一个服务器崩溃导致无法进行数据访问

具体操作如下:
在 varnish 端

配置 /etc/varnish/default.vcl

 [root@Server1 mnt]# vim /etc/varnish/default.vcl 
 编辑如下:
 probe healthcheck {
         .url = "/index.html";     # 哪个 url 需要 varnish 请求
         .interval = 5s;           # 检查的间隔时间
         .timeout = 1s;            # 等待多长时间探针超时
         .window = 5;              # 维持 5 个 sliding window 的结果
         .threshold = 3;           # 至少有三次 window 是成功的,就宣告bachend 健康
 }
 backend web1 {
   .host = "172.25.151.2";
   .port = "80";
   .probe = healthcheck;
 }

 backend web2 {
   .host = "172.25.151.3";
   .port = "80";
   .probe = healthcheck;
 }

 director test round-robin {   # 把多个后端聚合为一个组
 {  .backend = web1;  }
 {  .backend = web2;  }

 }
 sub vcl_recv {
 if (req.http.host ~ "^(www.)?test.com") {
         set req.http.host = "www.test.com";
         set req.backend = test;
         return(pass);   # 为了测试方便,不进行缓存
 }
 elsif (req.http.host ~ "^nba.test.com") {
         set req.backend = web2;
 }
 else {
         error 404 "test cache";
 }
 }

 编辑完成,进行重新加载
 [root@Server1 mnt]# /etc/init.d/varnish reload 

在这里插入图片描述

在这里插入图片描述

编辑完成,进行重新加载

在这里插入图片描述

在第二个http服务器进行配置

开启虚拟主机
编辑配置文件

 [root@Server3 ~]# vim /etc/httpd/conf/httpd.conf
 第 990 行  NameVirtualHost *:80  # 开启虚拟主机
 ......省略......
 <VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName nba.test.com
 </VirtualHost>

 <VirtualHost *:80>  
    DocumentRoot /www2
    ServerName www.test.com
 </VirtualHost>

在这里插入图片描述

建立虚拟主机的家目录与默认发布文件

 [root@Server3 ~]# mkdir /www2   # 创建目录
 [root@Server3 ~]# vim /www2/index.html   # 编辑默认发布文件
 [root@Server3 ~]# /etc/init.d/httpd restart  # 重启服务

在客户端进行测试

 [root@foundation151 images]# curl www.test.com # 访问指定域名
 <h1>www.test.com - server2 <h1/>   # 默认发布目录
 [root@foundation151 images]# curl www.test.com
 www.test.com - server3

由于在配置文件中加上了 return(pass) 不进行缓存,所以会直接切换到不同的服务器,这样更直观了看出了负载均衡的作用,要是在一台服务器宕掉的情况下,还是可以访问到相应信息的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值