使用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则会从第二台服务器调取资源,反复请求同一个资源在缓存时效之内除了第一次外剩下的所有请求都将从缓存服务器获取。



此时配置完毕

原文地址:http://blog.51cto.com/11970509/2348718

时间: 2024-10-28 02:07:04

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

Tomcat高级部分-使用特定模块和软件反向代理请求到后端tomcat实现负载均衡和session保持

实验目标: 1.反向代理服务器将用户请求负载均衡到后端tomcat节点: 2.配置基于nginx的负载均衡,实现会话绑定: 3.配置基于mod_jk的负载均衡,实现会话绑定: 4.基于mod_proxy实现负载均衡,实现会话绑定: 网络架构图: 网络主机规划表: 实验步骤: 前提配置: 1.tom1和tom2节点时间必须同步: 建议使用ntp协议进行: 参考博客:http://sohudrgon.blog.51cto.com/3088108/1598314 2.节点之间必须要通过主机名互相通信:

web服务器(LAMP)通过DNS轮询功能和nfs共享实现负载均衡

web服务器(LAMP)通过DNS轮询功能和nfs共享实现负载均衡,部署discuz论坛 拓扑思路: 服务器1:mariadb+nfs:172.20.120.40 服务器2:apache+php-fpm:172.20.120.41 服务器3:apache+bind:172.20.120.42 服务器1:mariadb+nfs:172.20.120.40 yum install mariadb-server nfs-utils 部署nfs共享:分别使用lvm当做数据库目录/mydata.网页文件目

Apache+varnish(高性能开源HTTP加速器)搭建负载均衡集群

实验环境:RHEL6.5 实验环境4台 真机进行访问测试     willis.example.com         172.25.254.6 虚拟机1(缓存端)   varnish.example.com       172.25.254.8 虚拟机2(服务器端1) web1.example.com     172.25.254.10 虚拟机3(服务器端2) web2.example.com     172.25.254.20 两台服务器主要用于负载均衡实验. 实验内容:1.服务器端安装Ap

网站架构(页面静态化,图片服务器分离,负载均衡)方案全解析

网站架构(页面静态化,图片服务器分离,负载均衡)方案全解析 文章分类:综合技术 1.HTML静态化其实大家都知道,效率最高.消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法.但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态

部署Tomcat服务器实现负载均衡

部署tomcat及负载均衡 简介: Tomcat最初是由Sun的软件架构师詹姆斯.邓肯.戴维森开发的,Tomcat服务器是一个免费的开放源代码的web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍应用,是开发和调试jsp程序的首选,Tomcat通常是作为一个Servlet和jsp容器,单独运行在后端.主要是作为使用java程序语言开发的网站部署的web服务器. 下面通过在虚拟机中搭建实验,来说明tomcat的使用并实现tomcat服务器的负载均衡 一.部署to

双节点(nginx+keepalived)为两台apache服务器提供负载均衡

说明:本实验为双节点nginx为两台apache服务器提供负载均衡,本文不是做lvs,所以realserver不是配置在keepalived.conf而是在nginx的配置文件中upstream.此架构需考虑的问题:1)Master没挂,则Master占有vip且nginx运行在Master上2)Master挂了,则backup抢占vip且在backup上运行nginx服务3)如果master服务器上的nginx服务挂了,则vip资源转移到backup服务器上4)检测后端服务器的健康状态Mast

【58沈剑架构系列】如何实施异构服务器的负载均衡及过载保护?

零.需求缘起 第一篇文章“一分钟了解负载均衡”和大家share了互联网架构中反向代理层.站点层.服务层.数据层的常用负载均衡方法. 第二篇文章“lvs为何不能完全代替DNS轮询”和大家share了互联网接入层负载均衡需要解决的问题及架构演进. 在这两篇文章中,都强调了“负载均衡是指,将请求/数据[均匀]分摊到多个操作单元上执行,负载均衡的关键在于[均匀]”. 然而,后端的service有可能部署在硬件条件不同的服务器上: 1)如果对标最低配的服务器“均匀”分摊负载,高配的服务器的利用率不足: 2

单节点nginx为两台apache服务器提供负载均衡

需求:本实验为单节点nginx为两台apache服务器提供负载均衡,所有配置为最简单 1.初始化3台测试server,该关的关了 [[email protected] ~]# vim /etc/hosts 192.168.1.101 ng-master 192.168.1.161 web1 192.168.1.162 web2 [[email protected] ~]# yum clean all [[email protected] ~]# systemctl stop firewalld.

两台web服务器实现负载均衡的解决方案

写在前面:如果此文有幸被某位朋友看见并发现有错的地方,希望批评指正.如有不明白的地方,愿可一起探讨. 总体方案 平台规划拓扑图如下: 总体解决方案: 两台web服务通过DNS实现负载均衡,共享NFS服务器,通过NFS服务器共享MySQL服务器 说明:接下来将搭建DNS服务器.两台web服务器.NFS服务器以及MySQL服务器,在此过程中只给出实现过程及其步骤,望理解. 搭建DNS服务器 1.编辑主配置文件 # vim /etc/named.conf options { directory   "