Linux企业级运维进阶教程2——Varnish的反向代理及负载均衡

环境配置母盘的封装

我们的实验使用rhel-server-6.5-x86_64-dvd.iso的镜像,然后用这个镜像安装一个虚拟机作为母盘,安装完成后进行以下配置:

(1)更改主机名:

vi /etc/sysconfig/network   #6.5文本编辑器为vi

在这里插入图片描述
(2)配置ip:

vi /etc/sysconfig/network-scripts/ifcfg-eth0

在这里插入图片描述
删除/etc/uaev/rules.d/70XXXXXX(否则新建的虚拟机快照网络起不来)
在这里插入图片描述
配置好后重启网络服务:
在这里插入图片描述
(3)添加地址解析

vi /etc/hosts

在这里插入图片描述
(4)关闭火墙

/etc/init.d/iptables stop
/etc/init.d/ip6tables stop
chkconfig iptables off
chkconfig ip6tables off

在这里插入图片描述
(5)设置selinux为disabled

vi /etc/sysconfig/seliniux

在这里插入图片描述
(6)配置yum源

vi /etc/yum.repo.d/rhel-source.repo

在这里插入图片描述
在这里插入图片描述
(7)安装基本软件

yum install -y vim lftp openssh-clients -y

配置好后poweroff,母盘就不要打开啦!之后再需要虚拟机快照就可以了。

最后在真机中清除虚拟机base的缓存
yum whatprovides */virt-sysprep  
yum install 1:libguestfs-tools-c-1.32.7-3.el7.x86_64 -y   ##安装命令
virt-sysprep -d base   ##清除虚拟机base的缓存

本次实验我们需要三个虚拟机来模拟企业环境,直接对母盘快照,安装三个虚拟机

 cd /var/lib/libvirt/images/
qemu-img create -f qcow2 -b base.qcow2 vm1
qemu-img create -f qcow2 -b base.qcow2 vm2
qemu-img create -f qcow2 -b base.qcow2 vm3

安装完成后三个虚拟机一模一样,我们需要更改vm2和vm3的主机名及ip

下面我们进入正题,先来了解一下Varnish:

(1)varnish是什么

Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等诸多优点,很多大型的网站都开始尝试使用 varnish 来替换 squid,这些都促进 varnish 迅速发展起来。

(2)varnish的特点
  • varnish可以通过端口进行管理,使用正则语句做到清除缓存的功能,这些squid都做不到,但是在varnish高并发的情况下,资源消耗较高,而且varnish服务进程一旦崩溃,重启,内存中的数据将会全部丢失。

  • varnish与一般服务机器软件类似,就是一个web缓存代理服务器。例如接受http请求,为缓存对象分配存储空间,清除过期缓存对象,释放空间 碎片整理。

  • http请求处理过程:
    有一个专门负责接收http请求的线程,一直监听请求端口,当有请求过来时,负责唤起一个工作线程来处理请求
    工作线程会分析http请求的url,知道了这个请求想要什么,就到缓存中查找是否有这个对象
    如果有,就把缓存对象直接返回给用户
    如果没有,会把请求转给后端服务器处理,并等待结果,工作线程从后端得到结果内容后,先把内容作为一个缓存对象保存到缓存空间(以备下次请求这个对象时快速响应),然后再把内容返回给用户

  • 分配缓存过程:
    有一个对象需要缓存时,根据这个对象的大小,到空闲缓存区中查找大小最适合的空闲块,找到后就把这个对象放进去,如果这个对象没有填满这个空闲块,就把剩余的空间做为一个新的空闲块,如果空闲缓存区中没地方了,就要先删除一部分缓存来腾出地方,删除是根据最近最少使用原则

  • 释放缓存过程
    有一个线程来负责缓存的释放工作,他定期检查缓存中所有对象的生存周期,如果某个对象在指定的时间段内没有被访问,就把这个对象删除,释放其占用的缓存空间,释放空间后,检查一下临近的内存空间是否是空闲的,如果是,就整合为一个更大的空闲块,实现空间碎片的整理

  • varnish的进程:master(management)进程和child(worker,主要做cache的工作)进程。master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程进行工作,主要包括一些管理线程和很多worker线程。

(3)vcl简介

Varnish Configuration Language(VCL)是varnish配置缓存策略的工具,它是一种基于‘域’的简单变成语言,使用VCL编写的缓存策略通常保存在.vcl文件中,其需要编以成二进制的格式后才能由varnish调用
VCL处理流程图
在这里插入图片描述
处理过程大致分为如下几个步骤:
(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或
Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进
入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。

一.varnish反向代理搭建

本次实验我们以server1主机为varnish代理服务器,server2为服务端,物理机为客户端

在server1主机
  • 准备varnish的安装包并安装,也可以在官网下载
    在这里插入图片描述
    在这里插入图片描述

安装完成后在系统的/etc/passwd中生成varnish用户,对varnish的访问控制实际上是对varnish用户的控制实现的
在这里插入图片描述

  • 配置varnish

      rpm -qc varnish-3.0.5-1.el6.x86_64  #查看varnish服务的配置文件
    

在这里插入图片描述

 vi /etc/sysconfig/varnish  配置文件


8 NFILES=131072  ##最多能打开的文件数,varnish会自动调整该数值
12 MEMLOCK=82000 #最多能使用的内存空间,varnish会自动调整该数值
15 NPROCS="unlimited" #单个用户所能运行的最大线程数,varnish会自动调整该数值
66 VARNISH_LISTEN=80#修改varnish的监听端口为80

在这里插入图片描述

netstat -tnlp  #查看端口是否打开

在这里插入图片描述
我们看到varnish最多能打开的文件数为131072,接下来我们查看一下系统内核最多能打开的文件数

sysctl -a | grep file	#查看系统文件数

在这里插入图片描述
可以看出系统内核最多能打开文件数为47360,明显小于131072,因为varnish这个程序运行在varnish这个用户的私有空间内,内核对普通用户限制的最大文件数为47360,varnish用户的最大文件限制为131072,在模拟中需要满足varnish用户的文件的最大值,我们可以通过减少varnish最大文件数或者增大系统最大文件数来满足,这里我们选择增大系统最大文件数。
在这里插入图片描述
在这里插入图片描述
varnish需要的资源,系统满足不到,因此需要让他受到限制,即给他营造假象

vim /etc/security/limits.conf   配置varnish用户的安全限制,造成varnish已经获得到了需要软件自身的资源,相当于在系统里告诉varnish虽然达不到要求,但尽力满足
在该文件最后写入:
varnish         -       nofile          131072
varnish         -       memlock         82000
varnish         -       nproc           unlimited

在这里插入图片描述

vim /etc/varnish/default.vcl  给varnish添加一个后端服务器
在文件中添加的内容如下:
backend default {
  .host = "172.25.254.2";   ##后端服务器的IP
 .port = "80";  ##后端服务器的端口

在这里插入图片描述

/etc/init.d/varnish   restart     重启服务 

在这里插入图片描述
最后我们查看一下varnish开启的进程
varnish开启的时候会开启两个进程:一个root,一个自身
在这里插入图片描述

在server2后端服务器
  • 安装apache并开启服务

在这里插入图片描述

  • 编写默认发布文件,以便检测
    在这里插入图片描述
在物理机上检测

curl 172.25.69.1 实际上1主机并不接受请求,而是通过反向代理将请求扔给2主机,所以访问到的是server2主机
在这里插入图片描述

二.Varnish缓存加速

在server1代理服务器上
  • 在配置文件编辑是否命中反馈信息

      12 sub vcl_deliver {
      13 if (obj.hits>0){		#如果命中显示
      14 set resp.http.X-Cache = "HIT from  cache";
      15 }
      16 else {
      17 set resp.http.X-Cache = "MISS from  cache";
      18 }
      19 return (deliver);
      20 }
    

    在这里插入图片描述

      /etc/init.d/varnish   restart  重启服务
    
在物理机上检测

第一次显示未命中缓存
在这里插入图片描述
第二次显示命中缓存
在这里插入图片描述

    第一次miss,在服务器上取的
    第二次及以上hit, 在缓存里取的
    Age:存在缓存里的时间,默认最多120秒
  • 清除缓存

      varnishadm ban.url .*$		   ##清除所有缓存
      varnishadm ban.url /index.html	    ##清除页面缓存(客户端curl -I ip/index,html 的内容会被清除)
      varnishadm ban.url /admin/$        #清除 admin 目录缓存
    

在这里插入图片描述
在server1代理服务器上清除所有缓存
在这里插入图片描述
再次在物理机查看
在这里插入图片描述

三.定义多个不同域名站点的后端服务器

在企业中我们不可能只有一个后端服务器,成百上千服务器会构成一个群组,此时就需要在varnish代理服务器上定义多个不同域名站点的后端服务器,客户端通过域名会访问不同的后端主机

实验前,为模拟不同的后端服务器,我们再打开一台虚拟机server3,安装http并编写默认发布主页以便检测效果

在server1代理服务器上
vim /etc/varnish/default.vcl   编写配置文件

7 backend web1 {		#后端第一个服务器名web1
8   .host = "172.25.69.2";	#将server2 www.hello.org作为第一个服务器主机
9   .port = "80";
10 }
 11 
12 backend web2 {		#后端第二个服务器名web2
13   .host = "172.25.69.3"; 	#将server3 bbs.hello.org作为第二个服务器主机
14   .port = "80";
15 }
 16     #当访问 www.hello.org 或 hello.org 域名时从 web1 上取数据;
#访问 bbs.hellos.org 域名时到 web2 取数据;
#访问其他,页面报错。
 17 sub vcl_recv {
18         if(req.http.host ~"^(www.)?hello.org") {		#以www.hello.org开头,但可以忽略www
 19                 set req.http.host = "www.hello.org";	#统一规定它为www.hello.org
 20                 set req.backend = web1;
 21 }elsif (req.http.host ~"^bbs.hello.org"){
22         set req.backend = web2;
 23 }else {
 24         error 404 "cache";
 25 }
26 }

在这里插入图片描述

service varnish reload   刷新服务

在这里插入图片描述

在物理机上测试
  • 进行地址解析

      vim /etc/hosts
    

在这里插入图片描述

  • 测试

      curl  www.hello.com
      curl  bbs.hello.com
    

在这里插入图片描述

四.varnish的负载均衡

这里我们同时可以利用http的虚拟主机发布来更明显的看出效果
目的: 让客户端访问www.hello.org的时候,客户端主机server2和server3轮循;访问bbs.hello.org时,只在server3

在seerver1代理服务器
vim /etc/varnish/default.vcl    编写配置文件

backend web1 {
 .host = "172.25.69.2";
.port = "80";
}
backend web2 {
.host = "172.25.69.3";
.port = "80";
}
director lb round-robin{        #设定负载均衡(指定算法:轮循)
    { .backend = web1;}
    { .backend = web2;}
}    
sub vcl_recv {
if (req.http.host ~ "^(www.)?hello.org") {
set req.http.host = "www.hello.org";
set req.backend = lb;        #指定轮循算法的定义名
    return (pass);                #关闭varnish缓存功能,这样不用每次清除缓存,实验效果更明显
} elsif (req.http.host ~ "^bbs.hello.org") {
set req.backend = web2;
} else {error 404 " cache";
}
}

在这里插入图片描述

service varnish reload
在server3上发布虚拟主机
  • 编写虚拟主机配置文件

      vim /etc/httpd/conf/httpd.conf      
    
       990 NameVirtualHost *:80    
       1011 <VirtualHost *:80>
      1012      DocumentRoot /www
      1013      ServerName www.hello.org
      1014 </VirtualHost>
      1015 <VirtualHost *:80>
      1016      DocumentRoot /bbs
      1017     ServerName bbs.hello.org
      1018 </VirtualHost>
    

在这里插入图片描述

在这里插入图片描述

  • 编写虚拟主机发布文件

在这里插入图片描述

在客户端测试

先清除一下代理服务器的缓存,否则看到的是之前的缓存
在这里插入图片描述

五.CDN推送平台的搭建

在企业中,我们使用CDN时如果每次都从代理服务器中去更改就太麻烦了,所以我们可以做一个页面平台,直接从页面中输入命令进行管理,就非常方便了。

在server1代理服务器
  • 安装平台资源并解压
    我们需要安装http、bansys.zip、php
    在这里插入图片描述

      unzip bansys.zip -d /var/www/html/    将压缩包解压到http默认发布目录下
      mv /var/www/html/bansys/* /var/www/html/    将解压的文件移动到apache默认发布目录下
    

在这里插入图片描述

  • 编写所获资源的php文件

      vim /var/www/html/config.php
    
      <?php
      //varnish主机列表
      //可定义多个主机列表
      $var_group1 = array(
                      'host' => array('172.25.69.1'),
                                              'port' => '8080',                
                  );
    
      //varnish群组定义
      //对主机列表进行绑定
      $VAR_CLUSTER = array(
                       'www.hello.org' => $var_group1,
                   );
    
    
      //varnish版本
      //2.x和3.x推送命令不一样
      $VAR_VERSION = "3";
    
      ?>
      除了这几行,剩余的都删掉
    

在这里插入图片描述

  • 将http的端口改为8080 (因为varnish用的80端口)

      vim /etc/httpd/conf/httpd.conf
      Listen 8080   
    
  • 重启http

      /etc/init.d/httpd start
      /etc/init.d/httpd restart
    

在这里插入图片描述

  • 修改varnish配置文件

bansys 有两种工作模式,分别是:telnet 和 http 模式。
telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S $
{VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。
#如果是 http 模式需要对 varnish 做以下设置:

	acl hello {
	"127.0.0.1";       #设置访问控制
	"172.25.60.0"/24;
	}

	sub vcl_recv {
	if (req.request == "BAN") {
	if (!client.ip ~ hello) {
	error 405 "Not allowed.";
	}
	ban("req.url ~ " + req.url);
	error 200 "ban added";
	}
	记得将return (pass)注释掉

在这里插入图片描述

/etc/init.d/varnish restart
在物理机上测试

打开firefox:http://172.25.69.1:8080/
我们输入一个清理缓存的命令看看效果
在这里插入图片描述
在这里插入图片描述
之后再次查看缓存命中情况,发现缓存被清除
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值