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
posted @ 2021-08-16 11:02  Final233  阅读(130)  评论(0编辑  收藏  举报