5.5 Varnish缓存

5.5.1 Varnish缓存状态

通过浏览器访问对应的网页可查看Varnish缓存的状态。如果Varnish缓存成功,第二次打开网页的速度会明显比第一次快,但是这种方式并不能充分说明缓存状态。下面以命令行的方式,通过查看网页头部来查看命中情况,如代码清单5-10所示。

代码清单5-10 查看Varnish缓存状态

[root@varnish ~]# curl -I http:// 127.0.0.1:2222/zachary/demo/showtime
HTTP/1.1 200 OK
Server: Tomcat/8.0
Last-Modified: Sat, 10 Jul 2019 11:25:15 GMT
ETag: "5e850b-616d-48b06c6031cc0"
Content-Type: application/json
Content-Length: 24941
Date: Fri, 09 Jul 2019 08:29:16 GMT
X-Varnish: 1364285597
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: MISS from 127.0.0.1

在代码清单5-10中,X-Cache:MISS表示此次访问未从缓存中读取,当我们第二次访问后,查看Varnish缓存状态,如代码清单5-11所示。

代码清单5-11 查看Varnish缓存状态

[root@varnish ~]# curl -I http:// 127.0.0.1:2222/zachary/demo/showtime
HTTP/1.1 200 OK
Server: Tomcat/8.0
Last-Modified: Sat, 10 Jul 2019 11:25:15 GMT
ETag: "5e850b-616d-48b06c6031cc0"
Content-Type: application/json
Content-Length: 24941
Date: Fri, 09 Jul 2019 08:29:16 GMT
X-Varnish: 1364285597
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT from 127.0.0.1

在代码清单5-11中,X-Cache:HIT表示此次访问从缓存中读取。通过查看请求的头部和响应能看出数据是否已经被Varnish缓存,但只有通过缓存命中率的高低才能说明Varnish运行的效果。较高的缓存命中率说明Varnish运行良好,反之,说明Varnish的配置策略存在问题,需要调整。因此,从整体的命中率上可以直接反馈出Varnish的效果。Varnish提供了varnishstat命令,可以监控命中的过程。下面介绍varnishstat命令使用方法,如代码清单5-12所示。

代码清单5-12 varnishstat命令使用

[root@varnish ~]#/usr/local/varnish/bin/varnishstat  -n /cache
Hitrate ratio:       10      90      120
Hitrate avg:     0.9999   0.9964   0.9964

       19960        98.92        1229.70 Client connections accepted
     225820       660.84       8701.07 Client requests received
     336802       530.78       6891.20 Cache hits
         68         0.00         691.34 Cache misses
       5688        33.96        220.37 Backend conn. success
       6336         1.00        191.52 Backend conn. reuses
       2642        33.96        47.14 Backend conn. was closed
       8978        29.96        29.67 Backend conn. recycles
       6389         1.00        70.79 Fetch with Length
       2630        32.96        69.08 Fetch chunked
        444          .            .   N struct sess_mem
         23          .            .   N struct sess
         64          .            .   N struct object
         78          .            .   N struct objectcore
         78          .            .   N struct objecthead
        132          .            .   N struct smf
          2          .            .   N small free smf
          3          .            .   N large free smf
          6          .            .   N struct vbe_conn
         14          .            .   N worker threads
         68         1.00         0.34 N worker threads created
          0         0.00         0.00 N queued work requests
       1201        11.99         5.98 N overflowed work requests
          1          .            .   N backends
          4          .            .   N expired objects
       3701          .            .   N LRU moved objects
     118109       942.85       587.61 Objects sent with write
       9985        71.91        49.68 Total Sessions
     121820       953.84       606.07 Total Requests

其中的参数详解如下。

  • Client connections accepted:表示客户端向反向代理服务器成功发送HTTP请求的总数量。
  • Client requests received:表示到现在为止,浏览器向反向代理服务器发送HTTP请求的累计次数。由于可能会使用长连接,因此这个值一般会大于Client connections accepted的值。
  • Cache hits:表示反向代理服务器在缓存区中查找并且命中缓存的次数。
  • Cache misses:表示直接访问后端主机的请求数量,也就是非命中数。
  • N struct object:表示当前被缓存的数量。
  • N expired objects:表示过期的缓存内容数量。
  • N LRU moved objects:表示被淘汰的缓存内容数量。

5.5.2 Varnish缓存管理

Varnish缓存管理的主要工作是迅速有效地控制和清除指定的缓存内容。Varnish清除缓存的操作相对比较复杂,可以通过Varnish的管理端口发送purge指令来清除不需要的缓存。清除缓存的命令如代码清单5-13所示。

代码清单5-13 Varnish清除缓存命令

#清除指定URL的缓存
/usr/local/varnish/bin/varnishadm -T 192.168.10.101:2000 purge.url /xxx相对路径
#例如清除缓存(http:// 192.168.10.101:2222/zachary/demo/showtime)
/usr/local/varnish/bin/varnishadm -T 192.168.10.101:2000 purge.url /zachary/demo/showtime

#如/demo/下面有很多访问连接,需要批量清除
/usr/local/varnish/bin/varnishadm -T 192.168.10.101:2000 purge.url^/zachary/demo/*$

#清除所有的缓存
/usr/local/varnish/bin/varnishadm -T 192.168.10.101:2000 purge.url^.*$

#查看最近清除的缓存
/usr/local/varnish/bin/varnishadm -T 192.168.10.101:2000 purge.list

有时不想通过Linux命令清除缓存,此时可以通过telnet到管理端口来清除缓存,如代码清单5-14所示。

代码清单5-14 后台管理清除缓存

[root@varnish ~]#telnet 192.168.10.101 2000
Trying 192.168.10.101...
Connected to localhost.localdomain (192.168.10.101).
Escape character is '^]'.
200 154
-----------------------------
Varnish HTTP accelerator CLI.
-----------------------------
Type 'help' for command list.
Type 'quit' to close CLI session.

purge.url  /zachary/demo/query  #清除这个连接的缓存数据
200 0

purge.url  ^/nodes/data/*$      #清除/nodes/data/目录下缓存数据
200 0