使用varnish的缓存功能实现后端服务器的负载均衡及资源的定向分发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用varnish的缓存功能实现后端服务器的负载均衡及资源的定向分发相关的知识,希望对你有一定的参考价值。

结构拓扑图:
技术图片
使用varnish软件实现后端两台web服务器的负载均衡并实现客户端请求内容的定向分发。
准备基础环境:

在三台后端服务器上安装httpd服务,其中一台作为图片服务器提供服务,另两台作为静态文本服务器。
yum install -y httpd
systemctl start httpd
systemctl enable httpd
关闭防火墙
systemctl stop firewalld
设置selinux为disabled
三台服务器做同样设置
在图片服务器的/var/www/html目录下上传几个jpg格式的图片
在两台web服务器上各创建10个测试页面
for i in {1..10};do echo "<h1>Test Page $i on Web2</h1>"  /var/www/html/test$i.html;done
for i in {1..10};do echo "<h1>Test Page $i on Web3</h1>"  /var/www/html/test$i.html;done
在缓存服务器上安装varnish软件
yum install -y varnish
systemctl start varnish
systemctl enable varnish

这里安装的是varnish4.0的版本,在安装完成后/etc/varnish目录下默认会生成3个配置文件
secret:安全认证文件,我们在登陆varnish的CLI管理界面的时候可以使用此文件进行验证
varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
varnish.params:这个文件中主要记录着主进程的配置信息,监听的socket,使用的存储类型,各主程序的工作特性等等

例如:
VARNISH_VCL_CONF=/etc/varnish/default.vcl  //默认调用的vcl配置参数文件
VARNISH_LISTEN_PORT=6081  //主进程监听的端口号,通常我们在实际生产环境中可以将端口号更改成80,直接使用客户端浏览器进行访问
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1   //进入CLI控制台模式使用的地址,默认只允许监听在本地地址。
VARNISH_ADMIN_LISTEN_PORT=6082  //进入CLI控制台监听的端口号
 VARNISH_SECRET_FILE=/etc/varnish/secret  //使用的登陆安全验证文件 
 VARNISH_STORAGE="malloc,256M"      //缓存使用哪种存储机制

default.vcl文件:配置缓存系统的缓存机制,指明线程中各缓存功能的工作机制
配置default.vcl文件:

首先定义缓存引擎的缓存机制,将参数定义到vcl_revc域中
if (req.method == "PRI") {
          return (synth(405));      
          }
          if (req.method != "GET" &&    //如果http请求报文信息不是下列信息,则表示缓存服务器不理解请求报文,直接将报文送到pipe模块进行丢弃或直接发送给后端服务器
          req.method != "HEAD"  &&
          req.method != "PUT"  &&
          req.method != "POST"  &&
          req.method != "TRACE"  &&
          req.method != "OPTIONS" &&
          req.method != "DELETE") {
          return (pipe);
          }
          if (req.method != "GET" && req.method != "HEAD") {
          return (pass);      //http请求报文为GET或者是HEAD信息,直接将请求发往后端服务器,不做本地缓存查询
          }
          if (req.http.Authorization || req.http.Cookie) {
          return (pass);    //http报文含有认证或者用户的Cookie敏感信息,则直接将请求发送到后端服务器,不在本地缓存查询。
          }
          return (hash);      //以上都不是则查找缓存并返回客户端缓存信息

接下来定义三台主机:

import directors;                //在正文定义调度模块
backend websrv1 {           //图片服务器
      .host = "192.168.153.8";
      .port = "80";
      .probe = {                     //定义健康状态检测
      .url = "/test1.html";
          }
  }
  backend websrv2 {          //web1服务器
      .host = "192.168.153.9";
      .port = "80";
      .probe = {
      .url = "/test1.html";
          }
  }
  backend websrv3 {         //web2服务器
      .host = "192.168.153.10";
      .port = "80";
  }

sub vcl_init {                 //我们在vcl_init域中将两台web服务器设置成集群方式
         new mycluster=directors.round_robin();     //使用directors.round_robin()的调度方式,这里注意我们要使用调度方式必须要在配置文件正文定义调用使用的****directors模块
          mycluster.add_backend(websrv2);
          mycluster.add_backend(websrv3);
               }

接下来我们返回到vcl_revc域中定义内容分发以及调用主机集群

 if (req.url ~ "(?i)^/login" || req.url ~ "(?i)^/admin") {
                  return(pass);     //http报文含有登陆认证信息直接将请求发送给后端服务器,不在本地缓存中查找
          }
          if (req.url ~ "(?i).(jpg|png|gif)$") {
             set req.backend_hint = websrv1;     //所有图片格式的请求发送给websrv服务器,并将返回的资源缓存到本地
          } else {
                  set req.backend_hint = mycluster.backend();  //其它请求发送到两台web服务器组成的集群服务中并肩服务器返回的结果缓存到本地
          }

完整的vcl_revc定义为
技术图片

在vcl_backend_response域中定义缓存时长,不定义的话会使用默认值
sub vcl_backend_response {
      if (bereq.url ~ ".(jpg|jpeg|gif|png)$") {
          set beresp.ttl = 30d;
      }
      if (bereq.url ~ ".(html|css|js)$") {
          set beresp.ttl = 7d;
     }
 }

技术图片
这里我们为了验证客户端获取的资源是否为缓存资源,可以调用变量来验证

 sub vcl_deliver {
     if (obj.hits>0) {
         set resp.http.X-Cache = "HIT form " + server.ip;   //显示为缓存资源并返回给客户端缓存服务器的IP信息
         } else {
         set resp.http.X-Cache = "Miss form" + server.ip;      //显示为非缓存资源并返回给客户端缓存服务器的IP信息
         }
 }

配置完成后还需要再CLI命令行处进行配置文件的编译并调用。
varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 进入CLI控制台
vcl.load one default.vcl 将default.vcl配置文件编译成第一版vcl缓存配置模板
vcl.use one 使用one模板

技术图片
最后使用客户端进行验证
技术图片
在浏览器的调试台查看资源调用信息
技术图片
访问web服务
技术图片
技术图片
注意这里因为缓存服务器的算法调用,我们请求test2.html将从第一台服务器调取资源,然后请求test3.html则会从第二台服务器调取资源,反复请求同一个资源在缓存时效之内除了第一次外剩下的所有请求都将从缓存服务器获取。

技术图片
技术图片
此时配置完毕

以上是关于使用varnish的缓存功能实现后端服务器的负载均衡及资源的定向分发的主要内容,如果未能解决你的问题,请参考以下文章

高可用haproxy调度varnish服务器缓存后端动静分离集群架构

Nginx LB+keepalived+varnish+NAMP架构部署wordpress实现动静分离

Varnish缓存负载均衡backend的实现

nginx反代+varnish缓存+后端LAMP平台集群实现

varnish基础应用

nginx反代varnish缓存服务器实现后端amp动静分离架构