varnish2----基础配置
varnish2----基础配置
varnish基础配置
vcl --> vcl compiler --> c compiler
简单处理逻辑
客户端请求报文 --> 判断URL是否是可缓存项 --> 不是可缓存项 --> 去后端服务取数据并返回给用户
若是可缓存项 --> 判断哈希值 --> 没有被命中 --> 去后端服务取数据并返回给用户
若缓存被命中 --> 缓存服务器直接返回给用户
varnish状态引擎
https://www.cnblogs.com/qiuhom-1874/p/12643549.html
以上是varnish4.0 的状态引擎图,每个状态引擎彼此的关系,以及 varnish 内部缓存处理逻辑
删除缓存vcl_purge --> vcl_synth返回删除操作结果
vcl_pipe表示如果通过 vcl_hash 处理后发现用户请求的方法不识别,这个时候会将请求报文交给 vcl_pipe 处理;
waiting表示等待,服务器负载已经上限了
到本地的第一步,根据本地的缓存策略,判断是不是要查询缓存
如果http 和https都开启的情况下,不建议开启协议哈希,内容一样,导致会有http和https数据各一份
默认本质上都是四层代理,简单来说七层是四层的一种特殊形式,其实vcl_pipe就是引用这种机制
请求到四层,四层识别是HTTP协议,则转给本地七层代理处理,在七层更为强大的处理逻辑
若不是HTTP协议,则转发给后端其他服务
PRE 是HTTP版本2引入的方法, varnish版本4还不支持
状态阶段
https://www.cnblogs.com/cutemsyu/p/6051876.html
第一阶段:
vcl_recv # 接受客户端请求,进行判断
第二阶段:
vcl_hash # 进行 hash 计算,不进行判读处理,计算之后送往各个第三阶段状态引擎中
第三阶段:
vcl_hit # 缓存命中,到此处理
vcl_pass # 缓存跳过
vcl_miss # 缓存未命中
vcl_purge # 清理缓存
vcl_pipe #对于无法识别的 http 首部请求直接送入管道,交由后端处理不再处理
第四阶段:
vcl_deliver: 大部分响应客户端的请求由此发送回去
vcl_synth: 接受来自 vcl_purge 的任务,对于指定的缓存,进行删除处理
后端状态分为两阶段:
第一阶段:
vcl_backend_fetch:接受来自前端状态 vcl_pass 或 vcl_miss 的任务,向后端主机发送请求
第二阶段:
vcl_backend_response:接受到后端返回正常状态报文,进行是否缓存检查,需要缓存的响应将其缓存,不需要则不缓存,最后送到 vcl_deliver
vcl_backend_error:后端主机错误,返回错误响应
除此之外还有两个特殊状态引擎:
vcl_init:在处理任何请求之前要执行的 vcl 代码:主要用于初始化 VMODs;
vcl_fini:所有的请求都已经结束,在 vcl 配置被丢弃时调用;主要用于清理 VMODs;
实例1,真实的缓存代理
用户 --> varnish --> docker
准备后端服务docker
yum install docker-ce
systemctl start docker
docker pull nginx:1.14-alpine
docker run --name web1 -d --net bridge -v /data/web1:/usr/share/nginx/html/ nginx:1.14-alpine
docker ps
测试本地访问容器
[root@localhost web1]# curl 172.17.0.2
this is nginx web1
目前varnish访问状态是503
[root@localhost ~]# curl 192.168.10.2:6081 -I
HTTP/1.1 503 Backend fetch failed
Date: Wed, 11 Aug 2021 09:01:38 GMT
Server: Varnish
Content-Type: text/html; charset=utf-8
Retry-After: 5
X-Varnish: 32778
Age: 0
Via: 1.1 varnish-v4
Content-Length: 282
Connection: keep-alive
修改varnish配置文件,后端IP及端口项
vim /etc/varnish/default.vcl
backend default {
.host = "172.17.0.2";
.port = "80";
}
重载varnish
注意不要重启varnish服务,使用重载varnish_reload_vcl
[root@localhost ~]# varnish_reload_vcl
Loading vcl from /etc/varnish/default.vcl
Current running config name is
Using new config name reload_2021-08-11T17:04:10
VCL compiled.
VCL 'reload_2021-08-11T17:04:10' now active
available 1 boot
active 0 reload_2021-08-11T17:04:10
Done
客户端测试访问
[root@localhost ~]# curl 192.168.10.2:6081 -I
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Wed, 11 Aug 2021 09:04:28 GMT
Content-Type: text/html
Content-Length: 19
Last-Modified: Wed, 11 Aug 2021 08:48:16 GMT
ETag: "61138ed0-13"
X-Varnish: 65544
Age: 0
Via: 1.1 varnish-v4
Connection: keep-alive
可使用交互式命令,默认是服务端操作,端口也只有本地开放,有交互和非交互式
[root@localhost ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 status
Child in state running
vcl开头都是于vcl管理相关的
使用交互式
查看详细版本信息
vcl.show -v boot
vcl.use NAME 可以切换版本
vcl切换上一个版本
vcl.use boot
测试访问状态码503
在切换回来
vcl.use reload_2021-08-11T17:04:10
测试访问状态码200
实例2,在http头部信息添加缓存标志及命中次数(修改回报报文)
在varnish代理端角度来看
客户端发过来的报文,不能修改
发给后端的请求报文,可修改
后端服务回报,不能修改
回报给客户端的报文,可修改,此处实例改这里http头部信息
修改varnish配置文件
vim /etc/varnish/default.vcl
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "Hit via " + server.ip;
} else {
set resp.http.X-Cache = "Miss from " + server.ip;
}
}
使用varnish客户端交互模式手工reload
先编译后应用
varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
varnish> vcl.load testvcl1 default.vcl
varnish> vcl.use testvcl1
客户端测试访问
root@localhost ~]# curl -I 192.168.10.2:6081
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Thu, 12 Aug 2021 02:18:02 GMT
Content-Type: text/html
Content-Length: 19
Last-Modified: Wed, 11 Aug 2021 08:48:16 GMT
ETag: "61138ed0-13"
X-Varnish: 32788
Age: 0
Via: 1.1 varnish-v4
X-cache: Miss from 192.168.10.2 第一次访问,缓存未命中
Connection: keep-alive
[root@localhost ~]# curl -I 192.168.10.2:6081
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Thu, 12 Aug 2021 02:18:02 GMT
Content-Type: text/html
Content-Length: 19
Last-Modified: Wed, 11 Aug 2021 08:48:16 GMT
ETag: "61138ed0-13"
X-Varnish: 65555 32789
Age: 39
Via: 1.1 varnish-v4
X-Cache: Hit via 192.168.10.2 缓存命中
Connection: keep-alive
实例3,根据请求的URL(目录路径path)来判断是否需要缓存
修改varnish配置文件
vim /etc/varnish/default.vcl
sub vcl_recv {
if (req.url ~ "(?i)^/login") {
return (pass);
}
}
重载varnish
varnish> vcl.load testvcl2 default.vcl
varnish> vcl.use testvcl2
客户端访问多次login目录未被缓存,访问其他目录则被缓存
[root@localhost web1]# curl -I 192.168.10.2:6081/login
HTTP/1.1 301 Moved Permanently
Server: nginx/1.14.2
Date: Thu, 12 Aug 2021 03:03:54 GMT
Content-Type: text/html
Content-Length: 185
Location: http://192.168.10.2/login/
X-Varnish: 65583
Age: 0
Via: 1.1 varnish-v4
X-Cache: Miss from 192.168.10.2
Connection: keep-alive
[root@localhost web1]# curl -I 192.168.10.2:6081/eshop
HTTP/1.1 301 Moved Permanently
Server: nginx/1.14.2
Date: Thu, 12 Aug 2021 03:03:41 GMT
Content-Type: text/html
Content-Length: 185
Location: http://192.168.10.2/eshop/
X-Varnish: 32824 32803
Age: 81
Via: 1.1 varnish-v4
X-Cache: Hit via 192.168.10.2
Connection: keep-alive