关于Varnish的相关知识

1.概念

  • Varnish是一个反向HTTP代理,有时称为HTTP加速器或Web加速器
  • 将文件或文件片段存储在内存中,使它们能够快速被提供
  • 本质上是一个键 / 值存储,它通常使用URL作为键
  • 是为现代硬件、现代操作系统和现代工作负载而设计的

2.关于HTTP协议

  • Internet的基本协议是TCP/IP协议栈(传输控制协议和网际协议)
  • 目前广泛使用的FTP(文件传输协议)、HTTP(超文本传输协议)、Archie Gopher等都是建立在TCP/IP上面的应用层协议
  • 不同的协议对应不同的应用,而HTTP协议是Web应用所使用的主要协议
HTTP协议是基于请求响应模式的
客户端向服务器发送一个请求
请求包含请求的方法(GET\POST\PUT等)、URI、协议版本(第几版)、
以及包含请求修饰符客户端信息和内容类似MIME的消息结果
服务器则以一个状态行为作为响应
响应的内容包括信息协议的版本、成功或错误编码、
加上包含服务器信息、实体元信息以及可能的实体内容
  • HTTP是无状态协议,依赖于瞬间或近乎瞬间的请求处理
  • 请求信息被立即发送,理想的情况是没有延时的进行处理,不过延时还是客观存在的
  • HTTP有一种内置的机构,在校洗的传递上有一定的灵活性:
  • 超时机制,一个超时就是客户机等待请求消息的返回信息的最长时间
  • 无状态协议:每一次请求和响应都是相对独立,Web服务器不能记住同样的请求,所以可能会做一些重复的动作。(cache:缓存)

3.基于HTTP协议的C/S请求响应机制的信息交换过程

1.建立连接: 客户端与服务器建立TCP连接(TCP三次握手)

2.发送请求: 打开一个连接后,客户端把请求信息发送到服务器的相应端口上,完成请求动作提交

3.发送响应: 服务器在处理完客户端请求之后,要向客户端发送响应消息

4.关闭连接: 客户端和服务器双方都可以通过关闭套接字来结束TCP/IP对话(TCP四次挥手)

4.原理

  • 代理服务器为varnish服务器

在这里插入图片描述

5.Varnish的配置

实验前的配置:
客户端机:172.25.254.76,hostname为foundation76.ilt.example.com
两台虚拟机作服务端:
开启varnish服务的服务器:172.25.254.1,hostname为number1
后端服务器1:172.25.254.2,hostname为number2

1>配置varnish服务器

  • 安装varnish:
下载varnish的安装包和依赖性包jemalloc
yum install jemalloc-3.6.0-1.el7.x86_64.rpm varnish-6.3.1-1.el7.x86_64.rpm -y
rpm -qc varnish-6.3.1-1.el7.x86_64

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

  • cat /usr/lib/systemd/system/varnish.service查看使varnish性能达到最优的参数
    在这里插入图片描述
  • ulimit -a #显示当前设置的默认支持最大开启的文件数量
  • 内存和最大打开文件数达不到要求在这里插入图片描述
  • sysctl -a | grep file
    在这里插入图片描述
  • ulimit -n 131072 #临时将当前设置的默认支持最大开启的文件数量改为131072(与varnish支持的相同),但实际能做到的还是硬件支持的最大开启的文件数量,如果硬件支持小于该数值,则按硬件支持的来
  • ulimit -a #查看当前设置的默认支持最大开启的文件数量
  • free -m #清空存储
  • ulimit -l 85 #临时将最大锁定内存值改为85
  • ulimit -a #查看当前设置的最大锁定内存值
    在这里插入图片描述
    在这里插入图片描述
  • 将虚拟机关机再开机,此时系统最大文件数达到要求
    在这里插入图片描述
  • vim /etc/security/limits.conf #系统参数限制文件,修改系统的参数
  • 可以写独立的用户或者进程可以获得的一些限制,添加varnish用户的一些限制(按照 /usr/lib/systemd/system/varnish.service文件的限制配置)
  • 修改内容如下:
    在这里插入图片描述
  • 安装varnish之后就会出现varnish用户,id是1000以前的
    在这里插入图片描述
  • vim /etc/varnish/default.vcl #更改主配置文件
  • 做这些设定,意为客户端访问varnish时,是通过varnish访问172.25.254.2(后端服务器1)的80端口(httpd服务)
  • 编辑内容为:
    在这里插入图片描述
  • systemctl start varnish #开启varnish服务
  • netstat -antlupe | grep varnish #查看varnish开启的端口,发现不是80端口,而是6081端口
  • vim /usr/lib/systemd/system/varnish.service #修改该文件
  • 编辑内容如下:
    在这里插入图片描述
  • systemctl restart varnish #重启varnish服务
  • netstat -antlupe | grep varnish #查看varnish开启的端口,为80

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

2>配置后端服务器

  • yum install httpd -y #安装httpd服务
  • systemctl start httpd #开启httpd服务
  • cd /var/www/html/ #进入到该目录下
  • vim index.html #创建index.html文件
  • 编辑内容为:hello,number2
    在这里插入图片描述
    在这里插入图片描述

3>在客户端测试

  • curl 172.25.254.1 #curl配置了varnish的服务器
  • hello,number2 #得到的结果为后端服务器1的答案

在这里插入图片描述

6.Varnish进程的工作模式

  • varnish启动会产生两个进程,manger主(管理management)进程,然后fork一个worker子进程
  • manger进程作用:读入(更新)配置,vcl文件爱你编译,varnish监控,初始化varnish管理接口
  • Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行
  • 如果在指定的时长内未得到Child进程的回应,Management将会重启此Child进程
  • ps -ef #显示进程
  • 第二个varnish的副进程是第一个varnish
    在这里插入图片描述
    在这里插入图片描述

7.查看Varnish的缓存功能

实验前的配置:
客户端机:172.25.254.76,hostname为foundation76.ilt.example.com
两台虚拟机作服务端:
开启varnish服务的服务器:172.25.254.1,hostname为number1
后端服务器1:172.25.254.2,hostname为number2

1)实验一:第一次配置缓存功能

1>在varnish服务器上配置

  • vcl_device模块: 在缓存数据将要发送到客户端时调用
  • vim /etc/varnish/default.vcl #编辑此文件
  • systemctl restart varnish #重启varnish服务
  • 编辑内容如下:
if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT from abcd cache"; #如果有缓存,则反馈HIT from abcd cache
}
else {
        set resp.http.X-Cache = "MISS from abcd cache"; #如果没有缓存,则反馈MISS from abcd cache
}
return (deliver);
}
resp:由varnish响应给client的http响应的报文
resp.http.:响应的报文的格式写法

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

2>在客户端测试

  • curl -I 172.25.254.1 #curl配置了varnish的服务器
  • curl -I 172.25.254.1 #再次curl配置了varnish的服务器
  • 第一次没命中,第二次命中
    在这里插入图片描述

2)实验二:清除缓存

1>在varnish服务器上配置

  • varnishadm ban req.url "~" / #清除varnish的全部缓存
  • ban:清理缓存中满足表达式条件的缓存对象
    在这里插入图片描述
  • varnishadm ban req.url “~” /index.html #清除页面index.html的缓存

在这里插入图片描述

2>在客户端测试

  • curl -I 172.25.254.1 #再次curl配置了varnish的服务器
  • 原本有缓存,被清除后显示无缓存

在这里插入图片描述

  • curl -I 172.25.254.1/index.html #指定访问index.html
  • 反馈访问index.html无缓存
  • curl -I 172.25.254.1
  • 因为只清除了index.html的缓存,所以访问172.25.254.1时有缓存
    在这里插入图片描述

8.通过域名访问varnish,并指定某域名对应某台后端服务器

实验前的配置:
客户端机:172.25.254.76,hostname为foundation76.ilt.example.com
三台虚拟机作服务端:
开启varnish服务的服务器:172.25.254.1,hostname为number1
后端服务器1:172.25.254.2,hostname为number2
后端服务器2:172.25.254.3,hostname为number3

1>在varnish服务器上配置

  • vcl_recv模块
vcl_recv是http请求到达后进入的第一个状态
在这个状态中,可以对请求进行以下的一些处理:
1、修改client请求,以减少缓存决策时的差异性
2、根据client请求,决定缓存策略
3、重定向请求
4、决定处理请求的backend(即后端webserver)
  • vim /etc/varnish/default.vcl #编辑此文件
  • systemctl restart varnish #重启varnish服务
  • 编辑内容如下:
sub vcl_recv {
if (req.http.host ~ "^(www.)?abcd.org"){   
        set req.http.host = "www.abcd.org";
        set req.backend_hint = web1;
}
#匹配www.开头的0次或1次,都返回域名为www.abcd.org,并将请求分为web1预处理
#意为通过域名abcd.org访问时,将abcd.org转化为www.abcd.org,并输出www.abcd.org的结果
#通过www.abcd.org访问时反馈web1的结果(后端服务器1)
elsif (req.http.host ~ "^qaz.abcd.org") {
        set req.backend_hint = web2;
}
#或者通过qaz.abcd.org访问时,反馈web2的结果(后端服务器2)
else {
        return (synth(405));
}
#若都不是则报错,提示报错为405
}

在这里插入图片描述

在这里插入图片描述

2>后端服务器配置

  • 后端服务器2和后端服务器1的配置相同

3>在客户端测试

vim /etc/hosts修改解析文件
172.25.254.1www.abcd.org qaz.abcd.org abcd.org 添加varnish服务器ip对应的域名
curl www.abcd.org用域名www.abcd.org访问varnish服务器
hello,number2反馈结果为web1的结果
curl abcd.org用域名abcd.org访问varnish服务器
hello,number2反馈结果为web1的结果
curl qaz.abcd.org用域名qaz.abcd.org访问varnish服务器
hello,number3反馈结果为web2的结果

在这里插入图片描述

9.负载均衡(轮循)

实验前的配置:
客户端机:172.25.254.76,hostname为foundation76.ilt.example.com
三台虚拟机作服务端:
开启varnish服务的服务器:172.25.254.1,hostname为number1
后端服务器1:172.25.254.2,hostname为number2
后端服务器2:172.25.254.3,hostname为number3
要达到的目标:
后端服务器2可以帮助后端服务器1来同时处理2个域名的请求
应该在后端服务器2上设置虚拟主机

1>配置后端服务器

  • 配置虚拟主机
    在这里插入图片描述
    在这里插入图片描述
  • 若在测试时,使用curl -I www.abcd.org出现403,则表示火墙有问题,需要在服务端上临时改变selinux的状态
    在这里插入图片描述

2>在varnish服务器上配置

  • vim /etc/varnish/default.vcl #编辑此文件
  • systemctl restart varnish #重启varnish服务
  • 编辑内容如下:
vcl 4.1;
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";
#导入该模块,否则服务重启不了
sub vcl_init {
        new lb = directors.round_robin();
        lb.add_backend(web1);
        lb.add_backend(web2);
}
#定义负载均衡,使地址轮循
sub vcl_recv {
if (req.http.host ~ "^(www.)?abcd.org"){
        set req.http.host = "www.abcd.org";
        set req.backend_hint = lb.backend();
		return (pass);  #关闭缓存,为了查询一次就清除一次缓存,避免缓存对实验效果的影响
}
elsif (req.http.host ~ "^qaz.abcd.org") {
        set req.backend_hint = web2;
}
else {
        return (synth(405));
}
}

3>在客户端测试

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

  • 第一次访问后端服务器1,第二次访问后端服务器2

10.使用cdn推送平台来清除缓存

  • 推送就是定期清除cdn缓存
  • 手动清除
    在这里插入图片描述

操作步骤

1>在varnish服务器上配置

  • yum install php unzip httpd -y #因为压缩包为php文件,因此需要安装php
  • unzip bansys.zip -d /var/www/html/ #解压
  • mv /var/www/html/bansys/* /var/www/html/ #将解压的内容移动到默认发布目录下
  • vim /etc/httpd/conf/httpd.conf #编辑子配置文件,更改端口,由于varnsh的端口为80,因此需要更改httpd的端口
  • 编辑内容为:将80端口改为8080
  • cd /var/www/html/ #切换到默认发布目录下
  • vim config.php #编辑php文件
  • cat config.php #查看php文件内容
  • systemctl start httpd #开启httpd服务
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
  • vim /etc/varnish/default.vcl #更改配置文件
  • systemctl restart varnish #重启服务
acl westos {
"172.25.254.1";
"172.25.254.0"/24;
}
#允许172.25.254.0/24网段的用户进行访问
sub vcl_recv {
if (req.method == "BAN") {
        if (!client.ip ~ westos) {
                return(synth(405,"Not allowed"));
        }
ban("req.url ~ " + req.url);
        return(purge); #取出相应缓存的对象内容然后清除
}
}

2>在客户端测试

  • 在客户端的浏览器中访问172.25.254.1:8080

  • 若页面没有显示,则是php脚本出现问题
    在这里插入图片描述

  • 第一次失败,第二次成功
    在这里插入图片描述

  • 推送.*清除所有缓存
    在这里插入图片描述
    在这里插入图片描述

  • 第一次失败,第二次成功
    在这里插入图片描述

  • 清除特定页面缓存
    在这里插入图片描述
    在这里插入图片描述

  • 第一次失败,第二次成功
    在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值