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
#临时将最大锁定内存值改为85ulimit -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.1 | www.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文件,因此需要安装phpunzip 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脚本出现问题
-
第一次失败,第二次成功
-
推送
.*
清除所有缓存
-
第一次失败,第二次成功
-
清除特定页面缓存
-
第一次失败,第二次成功