Varnish初见

今天来了解下另一个缓存服务器应用 - Varnish.

先前我们了解过Nginx了, 这是一个性能强大的反向代理服务器, 另外通过一些插件还可以成为一个缓存服务器, 只不过它只能支持一些静态文件的缓存了, 而我们今天说的这个Varnish就是一个专业的Cache服务, 当然也可以作为代理使用.

永远都有的概述

首先我们知道, 用户发送过来的请求在一个稍微好点的架构中, 都是先到达的我们的负载均衡器, 也就是Load Balancer. 接着根据用户所请求的资源的种类不同, 将会被负载均衡器送到不同的后端服务器组. 另外的, 用户所请求的资源主要是分成结构化数据和非结构化数据. 如果是结构化的数据, 我们会把数据存放在数据库中, 根据情况我们还会做数据库的读写分离, 所有读数据的请求都会被发到读数据库, 而所有的写请求都会被发送到写数据库, 这就是基本的读写分离了.

但是这样随之而来就会有一个问题, 应用程序如何知道该访问哪一个位置的数据库系统呢. 如果是硬编码到程序中这就显得耦合度很高了, 因此在这种情况下我们应该使用中间件来处理, 这个中间件可以理解成是一种查询路由或者连接池, 如果发送过来的请求超过了后台数据库系统的最大负载能力, 这个中间件还可以作为消息队列来放松后端数据库系统的压力.

如果是非结构化的数据就是被存储在文件系统上的, 这样就很大程度上会依赖磁盘的IO能力, 举个例子, 如果我们的数据是很大量的图片文件, 这种情况下的简单本地文件系统读取会造成很大的压力, 这种情况下, 我们可能会通过分布式, SAN存储网络等等来解决问题.

上面说的都是动态资源服务的一些情况, 而对于我们的HTML文本格式文档, JavaScript脚本文件, CSS层叠样式表等等, 他们都可以以较高的压缩比来进行压缩, 而且更新的频度都要比图片高. 在这种情况下, 他们应该和图片服务器组分割开来.

但是不管是这种文本格式文档还是图片静态资源 他们都可以被缓存从而提高服务效率, 并且减轻后台资源(文件系统)的压力

缓存的概念

对于缓存, 我们都知道数据和资源之所以可以缓存, 是因为程序的时间局部性和空间局部性. 并且被缓存的资源可以以非常快速的方式被访问到, 这是因为他们采用Key-Value的方式存储的.

另外由于我们的数据繁多, 不可能所有的数据都被缓存, 我们优先需要缓存的资源都是所谓的热点资源, 也就是那些会被访问的比较多的数据. 而且, 我们缓存的东西也是会过期的, 我们的缓存对象(Cache Object)是存在生命周期的. 当我们的缓存空间已经满了的时候, 自然需要把那些最旧的或者使用最小的缓存对象清掉然后替换成新的. 这里一般所用的都是LRU算法, 而且这种替换一般都是一个单独的进程来进行的.

同样的道理, 我们所缓存的数据一般情况下只需要缓存那些公共的数据, 对于用户的私有数据我们是不需要缓存的, 而且也不应该缓存.

接下来我们来看一下缓存的处理步骤:

接受请求 –> 解析请求 (提取请求中的URL和各种首部) –> 查询缓存 –> 新鲜度检测 –> 创建响应报文 –> 发送响应 –> 记录日志

缓存新鲜度

这里面有一个至关重要的一步叫做新鲜度检测. 在HTTP版本是1.0, 会使用到一个响应首部来检测(HTTP/1.1中也有这个), 叫做Expire. 我们可以来随便访问一个网站看一下.

http_expire

这个是百度的logo, 可以看到高亮的部分就写了在10年后才会过期. 不过你应该也注意到了一个地方, 这里所使用的时间是个绝对的时间, 但是我们是存在时差这个东西的, 也就是说有可能一个新鲜度时间对用户来说由于时差的影响并不新鲜, 因此在HTTP/1.1版本 中, 我们使用一个另外一个响应头部来得到缓存时间是多久, 那就是上面图中的Cache-Control.

这个属性的的一个典型的值就是像上面所使用的max-age. 我不需要来决定具体的过期时间了, 只要告诉客户端从当前开始, 这个资源有效的时间是多长时间(s). 至于到底什么时候会过期, 有客户端自己去计算就好了.

这里我们是从客户端的角度来看的, 其实在我们的缓存服务器和真实的资源服务器之间还存在一个有效性再验证: revalidate. 这里就会分成三种情况了:

  • 如果原始内容没有发生改变, 响应的主体部分不会被附带, 状态码是304 (Not modified)
  • 如果内容发生了改变, 则正常响应, 响应码200
  • 如果内容已经不存在于资源服务器上, 则会直接响应404. 接着缓存服务器也会删除cache object.

另外, 还有一些我们在HTTP协议的学习中了解到的一些条件式请求头部:

  • If-Modified-since: 基于请求的时间戳做验证
  • If-Unmodified-since
  • If-Match: 基于Etag来做验证, 这个Etag就像是一个文件校验码一样的概念, 上面的百度logo请求中也有这个属性
  • If-None-Match

Varnish初见

接下来就到了我们的主角的登场了, 关于Varnish的初步印象, 你可以用Squid来认识它. 而Varnish和Squid的关系其实就类似我们之前所学的Nginx和Apache httpd的关系. 两者之间在性能上, Varnish要稍占优势而稳定性上, Squid要比Varnish更加稳定. Squid可以说是很老牌的缓存代理了, 而Varnish由于采用了比较新的缓存技术, 因此性能优越, 使用量也是不错的.

那么在引入了这样一个缓存组件进入我们的架构, 前端是一个负载均衡的调度器, 很显然这里就不能再使轮询之类的调度算法了, 因为这样下去的缓存几乎都是失效的. 一般情况下, 如果说我们的前端调度是HAproxy的话, 这里应该使用的调度算法显然应该使用URI来确保我们的缓存是有效的.

另外, 还有更大型的缓存网络. 例如借助全局的DNS, 一个典型的例子就是我们的CDN和GSLB. CDN借由节点之间的内容缓存控制协议来实现在用户的请求到达我们的后端架构之前, 会先在一个缓存网络中进行查找, 每一个用户只会被路由到他最近的节点.

我们来看看Varnish的架构图;

varnish_arch

Varnish也同样使用DSL(domain-specific language, 领域特定语言)来进行配置, 这里就叫做VCL, 也就是Varnish Configuration Language. 可以看到Varnish 主要分成两个部分, 主进程:也叫做管理进程, 子进程, 也即是缓存进程, 首先是主进程通过读取我们所编写的Varnish配置文件通过VCL编译器将他们编译成C代码, 接着通过C编译器得到*.so. 然后叫做子进程来进行真正的缓存操作.

而主进程可以通过我们的命令行界面或者telnet, 或者Web接口. 说起来 这里我们只使用CLI的方式, telnet太不安全应该已经被废弃, 而Web界面是Varnish所提供的需要付费的组件.

对于Varnish所生成的日志文件, 我们可以从图的右侧看到, 有多种分析工具啥的. 值得一说的是: Varnish所生成的日志内存空间对于所有的子进程而言都是共享的, 并且这一段内存是一个环状的空间, 当最后一个日志填满了只会, 就会从头开始继续写入.

稍微小结一下就是, Varnish的主进程主要负责监控Varnish, 管理子进程, 初始化Varnish, 以及提供CLI接口.

而子进程分成以下这些组件:

  • Accepter: 接收到的连接请求.
  • worker threads: 处理用户请求
  • Expiry: 清理缓存中的过期对象

日志, 是一个共享的环状空间, 共享内存的大小一般默认是90MB, 前一部分是计数器, 后一部分请求相关的数据.

另外, 如果需要配置Varnish进行工作, 我们需要使用vcl来进行, 是一个基于域的简单编程语言.

Varnish的默认监听端口是6081.

Varnish的安装

如果是CentOS7的话, 只要你配置了epel源, 就可以直接通过yum进行下载和安装, 下载的大版本应该是4版本的.

varnish之所以性能优越, 是因为他依赖了一个高效的并发malloc的软件包, 你可以看到关于这个软件包的相关介绍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@VM-node0 ~]# rpm -q --whatrequires jemalloc
varnish-4.0.5-1.el7.x86_64
[root@VM-node0 ~]# rpm -qi jemalloc
Name : jemalloc
Version : 3.6.0
Release : 1.el7
Architecture: x86_64
Install Date: Fri 07 Sep 2018 02:58:20 PM CST
Group : System Environment/Libraries
Size : 324797
License : BSD
Signature : RSA/SHA256, Wed 02 Apr 2014 02:28:23 AM CST, Key ID 6a2faea2352c64e5
Source RPM : jemalloc-3.6.0-1.el7.src.rpm
Build Date : Tue 01 Apr 2014 06:33:02 AM CST
Build Host : buildvm-24.phx2.fedoraproject.org
Relocations : (not relocatable)
Packager : Fedora Project
Vendor : Fedora Project
URL : http://www.canonware.com/jemalloc/
Summary : General-purpose scalable concurrent malloc implementation
Description :
General-purpose scalable concurrent malloc(3) implementation.
This distribution is the stand-alone "portable" implementation of jemalloc.

接下来还是向往常一样, 我们来看看Varnis安装了啥:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@VM-node0 ~]# rpm -ql varnish
/etc/logrotate.d/varnish
/etc/varnish
/etc/varnish/default.vcl
/etc/varnish/varnish.params
/run/varnish.pid
/usr/bin/varnishadm
/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishstat
/usr/bin/varnishtest
/usr/bin/varnishtop
/usr/lib/systemd/system/varnish.service
/usr/lib/systemd/system/varnishlog.service
/usr/lib/systemd/system/varnishncsa.service
/usr/sbin/varnish_reload_vcl
/usr/sbin/varnishd
...(omitted)
/var/lib/varnish
/var/log/varnish

可以看到它的配置文件是一个使用*.vcl来做结尾的文件, 还有一个以*.params结尾的文件. 这个文件是干什么的呢?

打开看一下就能明白了, 其实就是一个存储一些变量值的文件, 就类似我们Shell的环境变量一样. 我们打开他的启动服务unit看一下就能明白了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
[root@VM-node0 ~]# cat /usr/lib/systemd/system/varnish.service
[Unit]
Description=Varnish Cache, a high-performance HTTP accelerator
After=network.target

[Service]
# If you want to make changes to this file, please copy it to
# /etc/systemd/system/varnish.service and make your changes there.
# This will override the file kept at /lib/systemd/system/varnish.service
#
# Enviroment variables may be found in /etc/varnish/varnish.params
#

# Maximum number of open files (for ulimit -n)
LimitNOFILE=131072

# Locked shared memory (for ulimit -l)
# Default log size is 82MB + header
LimitMEMLOCK=82000

# On systemd >= 228 enable this to avoid "fork failed" on reload.
#TasksMax=infinity

# Maximum size of the corefile.
LimitCORE=infinity

EnvironmentFile=/etc/varnish/varnish.params

Type=forking
PIDFile=/var/run/varnish.pid
PrivateTmp=true
ExecStart=/usr/sbin/varnishd \
-P /var/run/varnish.pid \
-f $VARNISH_VCL_CONF \
-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
-T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
-S $VARNISH_SECRET_FILE \
-u $VARNISH_USER -g $VARNISH_GROUP \
-s $VARNISH_STORAGE \
$DAEMON_OPTS

ExecReload=/usr/sbin/varnish_reload_vcl

[Install]
WantedBy=multi-user.target

这里就制定了环境配置文件是/etc/varnish/varnish.params. 而后面启动的参数有很多都是从这个文件获取的, 也就是说我们通过改变这个环境变量配置文件来实现不同的启动参数.

Varnish的缓存对象

Varnish是如何存储他的缓存对象的呢? 我们接下来来了解一下.

我们已经知道Nginx的缓存机制是通过目录层级建立在文件系统上的. 键保存在内存中. 这种做法的一个显然易见的缺点是会占用大量的inode. 而Varnish是不同的, 他只是用了一个文件, 单个大文件的感觉. 这个文件中使用Varnish自己的存储方式来进行整理. 但是同样的, Varnish在运行过程中是绝对不可以进行重启的, 因为为了能够识别这个文件, 需要在内存中维护一些识别数据, 只要重启了之后, 所有的缓存对象都会失效, 也就是说这种方式是不支持持久机制的.

另外, Varnish还支持另外两种存储方式, 一种是基于内存的, 也就是使用malloc, 这种方式同样是不支持持久化的. 最后一种叫做persistent, 这个是存储在磁盘上的, 而且支持持久化, 有点类似之前的Nginx了, 但是这个功能在3版本 之前一直作为实验性功能不建议使用, 这种情况下, 对我们的磁盘IO能力就是一个考验了.

配置Varnish

对于Varnish的配置方式, 我们刚刚已经在上面说过了, 可以通过修改那个环境变量文件来达到配置的效果. 这个只是Varnish的一种配置方式, 除此之外, 我们还可以通过在命令行接口中, 进行一些运行时参数的修改.

另外, 还记得Varnish的vcl文件吗, 这个文件是用来进行Varnish缓存系统的一些缓存机制的 , 只不过, 使用这个文件一定要先编译, 之后才会生效, 同时你需要确保运行环境有gcc编译器才可以.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Main configuration file. You probably want to change it.
VARNISH_VCL_CONF=/etc/varnish/default.vcl

# Default address and port to bind to. Blank address means all IPv4
# and IPv6 interfaces, otherwise specify a host name, an IPv4 dotted
# quad, or an IPv6 address in brackets.
# VARNISH_LISTEN_ADDRESS=192.168.1.5
VARNISH_LISTEN_PORT=6081

# Admin interface listen address and port
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
VARNISH_ADMIN_LISTEN_PORT=6082

# Shared secret file for admin interface
VARNISH_SECRET_FILE=/etc/varnish/secret

# Backend storage specification, see Storage Types in the varnishd(5)
# man page for details.
VARNISH_STORAGE="malloc,256M"

# User and group for the varnishd worker processes
VARNISH_USER=varnish
VARNISH_GROUP=varnish

# Other options, see the man page varnishd(1)
#DAEMON_OPTS="-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"

在这个文件中, 我们可以看到监听地址, 端口, 管理CLI秘钥文件的, 存储方式等等的修改, 这里安装的版本默认使用了malloc的方式来进行缓存, 这个内存空间的大小是256M. 如果想改成文件方式该如何做呢 只要把这个参数的值修改成这个样子:

1
VARNISH_STORAGE="file,/storage/data/varnish.bin,1G"

类似这样就行了, 不解释也能看得懂吧.

接下来就是vcl文件了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# Marker to tell the VCL compiler that this VCL has been adapted to the
# new 4.0 format.
vcl 4.0;

# Default backend definition. Set this to point to your content server.
backend default {
.host = "127.0.0.1";
.port = "8080";
}

sub vcl_recv {
# Happens before we check if we have this in cache already.
#
# Typically you clean up the request here, removing cookies you don't need,
# rewriting the request, etc.
}

sub vcl_backend_response {
# Happens after we have read the response headers from the backend.
#
# Here you clean the response headers, removing silly Set-Cookie headers
# and other mistakes your backend does.
}

sub vcl_deliver {
# Happens when we have all the pieces we need, and are about to send the
# response to the client.
#
# You can do accounting or modifying the final object here.
}

关于VCL的更多信息我们之后再说, 现在我们来配置一下后端主机.

这里我把主机的地址改到了他自己的80端口, 接着我们先来启动Varnish.

varnish的默认端口是6081, 我们访问一下试试.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
C:\Users\lenovo\Desktop
λ curl 192.168.16.100:6081 -v
* Rebuilt URL to: 192.168.16.100:6081/
* Trying 192.168.16.100...
* TCP_NODELAY set
* Connected to 192.168.16.100 (192.168.16.100) port 6081 (#0)
> GET / HTTP/1.1
> Host: 192.168.16.100:6081
> User-Agent: curl/7.55.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sun, 09 Sep 2018 11:46:48 GMT
< Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/5.4.16
< Last-Modified: Fri, 20 Oct 2017 16:27:33 GMT
< ETag: "19-55bfcf32d89d7"
< Content-Length: 25
< Content-Type: text/html; charset=UTF-8
< X-Varnish: 65540 3
< Age: 65
< Via: 1.1 varnish-v4
< Connection: keep-alive
< Accept-Ranges: bytes
<
Sorry, under maintenance
* Connection #0 to host 192.168.16.100 left intact

可以看到, 访问正常进行了, 而且我们还能看到响应头中写了经由Varnish代理服务器, 而处理请求的是Apache httpd.

接下来我们保持Varnish的运行, 来看一下他的命令行管理工具.

1
2
3
4
5
[root@VM-node0 ~]# varnishadm -h
varnishadm: invalid option -- 'h'
usage: varnishadm [-n ident] [-t timeout] [-S secretfile] -T [address]:port command [...]
-n is mutually exlusive with -S and -T

我们需要指定一下使用的秘钥文件位置和管理端口, 这里可以直接在后面发送相关的命令, 也可以不写进入交互式界面来进行操作. 现在就来试一下.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
root@VM-node0 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
200
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,3.10.0-862.11.6.el7.x86_64,x86_64,-smalloc,-smalloc,-hcritbit
varnish-4.0.5 revision 07eff4c29

Type 'help' for command list.
Type 'quit' to close CLI session.

help
200
help [<command>]
ping [<timestamp>]
auth <response>
quit
banner
status
start
stop
vcl.load <configname> <filename>
vcl.inline <configname> <quoted_VCLstring>
vcl.use <configname>
vcl.discard <configname>
vcl.list
param.show [-l] [<param>]
param.set <param> <value>
panic.show
panic.clear
storage.list
vcl.show [-v] <configname>
backend.list [<backend_expression>]
backend.set_health <backend_expression> <state>
ban <field> <operator> <arg> [&& <field> <oper> <arg>]...
ban.list

成功了, 我们可以通过使用键入help来查看所有支持的命令.

一些比较基础的看一下就能明白的, 就直接过一下就好了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

ping
200
PONG 1536493933 1.0
status
200
Child in state running
vcl.list
200
active 0 boot

vcl.load test /etc/varnish/default.vcl
200
VCL compiled.
vcl.list
200
active 0 boot
available 0 test

vcl.use test
200
VCL 'test' now active
vcl.list
200
available 0 boot
active 0 test

vcl.use boot
200
VCL 'boot' now active
vcl.discard test
200

vcl.list
200
active 0 boot

上面就是对vcl文件的编译载入使用以及删除的演示, 其实还是挺简单的.

接着往下, 我们可以通过param子命令来对一些运行参数进行修改, 并且可以通过show加上-l参数来查看所有配置选项详细的信息(很大量), 例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
param.show thread_pool_max
200
thread_pool_max
Value is: 5000 [threads] (default)
Default is: 5000
Minimum is: 100

The maximum number of worker threads in each pool.

Do not set this higher than you have to, since excess worker
threads soak up RAM and CPU and generally just get in the way
of getting work done.

Minimum is 10 threads.

NB: This parameter may take quite some time to take (full)
effect

这就是显示这个配置选项的一些描述和值.

有关这个管理工具更多和VCL引擎, 我们之后再说.

Varnish的日志

我们之前说Varnish有多个管理日志的工具, 现在就来直接查看一下效果吧.

  • Varnishlog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
[root@VM-node0 ~]# varnishlog
* << BeReq >> 8
- Begin bereq 7 fetch
- Timestamp Start: 1536494709.508570 0.000000 0.000000
- BereqMethod GET
- BereqURL /
- BereqProtocol HTTP/1.1
- BereqHeader Host: 192.168.16.100:6081
- BereqHeader Upgrade-Insecure-Requests: 1
- BereqHeader User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
- BereqHeader Sec-Metadata: cause=forced, destination=document, target=top-level, site=cross-site
- BereqHeader Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
- BereqHeader Accept-Language: en,zh;q=0.9,zh-CN;q=0.8,en-US;q=0.7
- BereqHeader X-Forwarded-For: 192.168.16.1
- BereqHeader Accept-Encoding: gzip
- BereqHeader X-Varnish: 8
- VCL_call BACKEND_FETCH
- VCL_return fetch
- BackendClose 18 default(127.0.0.1,,80) toolate
- BackendOpen 18 default(127.0.0.1,,80) 127.0.0.1 34012
- Backend 18 default default(127.0.0.1,,80)
- Timestamp Bereq: 1536494709.508876 0.000305 0.000305
- Timestamp Beresp: 1536494709.510254 0.001684 0.001379
- BerespProtocol HTTP/1.1
- BerespStatus 200
- BerespReason OK
- BerespHeader Date: Sun, 09 Sep 2018 12:05:09 GMT
- BerespHeader Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/5.4.16
- BerespHeader Last-Modified: Fri, 20 Oct 2017 16:27:33 GMT
- BerespHeader ETag: "19-55bfcf32d89d7"
- BerespHeader Accept-Ranges: bytes
- BerespHeader Content-Length: 25
- BerespHeader Content-Type: text/html; charset=UTF-8
- TTL RFC 120 -1 -1 1536494710 1536494710 1536494709 0 0
- VCL_call BACKEND_RESPONSE
- VCL_return deliver
- Storage malloc s0
- ObjProtocol HTTP/1.1
- ObjStatus 200
- ObjReason OK
- ObjHeader Date: Sun, 09 Sep 2018 12:05:09 GMT
- ObjHeader Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/5.4.16
- ObjHeader Last-Modified: Fri, 20 Oct 2017 16:27:33 GMT
- ObjHeader ETag: "19-55bfcf32d89d7"
- ObjHeader Content-Length: 25
- ObjHeader Content-Type: text/html; charset=UTF-8
- Fetch_Body 3 length stream
- BackendReuse 18 default(127.0.0.1,,80)
- Timestamp BerespBody: 1536494709.510310 0.001740 0.000056
- Length 25
- BereqAcct 506 0 506 272 25 297
- End

* << Request >> 7
- Begin req 6 rxreq
- Timestamp Start: 1536494709.508290 0.000000 0.000000
- Timestamp Req: 1536494709.508290 0.000000 0.000000
- ReqStart 192.168.16.1 4715
- ReqMethod GET
- ReqURL /
- ReqProtocol HTTP/1.1
- ReqHeader Host: 192.168.16.100:6081
- ReqHeader Connection: keep-alive
- ReqHeader Cache-Control: max-age=0
- ReqHeader Upgrade-Insecure-Requests: 1
- ReqHeader User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
- ReqHeader Sec-Metadata: cause=forced, destination=document, target=top-level, site=cross-site
- ReqHeader Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
- ReqHeader Accept-Encoding: gzip, deflate
- ReqHeader Accept-Language: en,zh;q=0.9,zh-CN;q=0.8,en-US;q=0.7
- ReqHeader If-None-Match: "19-55bfcf32d89d7"
- ReqHeader If-Modified-Since: Fri, 20 Oct 2017 16:27:33 GMT
- ReqHeader X-Forwarded-For: 192.168.16.1
- VCL_call RECV
- VCL_return hash
- ReqUnset Accept-Encoding: gzip, deflate
- ReqHeader Accept-Encoding: gzip
- VCL_call HASH
- VCL_return lookup
- Debug "XXXX MISS"
- VCL_call MISS
- VCL_return fetch
- Link bereq 8 fetch
- Timestamp Fetch: 1536494709.510330 0.002040 0.002040
- RespProtocol HTTP/1.1
- RespStatus 200
- RespReason OK
- RespHeader Date: Sun, 09 Sep 2018 12:05:09 GMT
- RespHeader Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/5.4.16
- RespHeader Last-Modified: Fri, 20 Oct 2017 16:27:33 GMT
- RespHeader ETag: "19-55bfcf32d89d7"
- RespHeader Content-Length: 25
- RespHeader Content-Type: text/html; charset=UTF-8
- RespHeader X-Varnish: 7
- RespHeader Age: 0
- RespHeader Via: 1.1 varnish-v4
- VCL_call DELIVER
- VCL_return deliver
- Timestamp Process: 1536494709.510346 0.002057 0.000016
- RespProtocol HTTP/1.1
- RespStatus 304
- RespReason Not Modified
- RespReason Not Modified
- RespUnset Content-Length: 25
- Debug "RES_MODE 0"
- RespHeader Connection: keep-alive
- Timestamp Resp: 1536494709.511031 0.002742 0.000685
- Debug "XXX REF 2"
- ReqAcct 605 0 605 307 0 307
- End

* << Session >> 32770
- Begin sess 0 HTTP/1
- SessOpen 192.168.16.1 4716 :6081 192.168.16.100 6081 1536494709.487511 16
- SessClose RX_TIMEOUT 5.095
- End

* << Session >> 6
- Begin sess 0 HTTP/1
- SessOpen 192.168.16.1 4715 :6081 192.168.16.100 6081 1536494709.487469 14
- Link req 7 rxreq
- SessClose RX_TIMEOUT 5.095
- End

这个是记录的比较详细的一个了.

  • varnishncsa
1
2
3
4
5
[root@VM-node0 ~]# varnishncsa
192.168.16.1 - - [09/Sep/2018:20:06:00 +0800] "GET http://192.168.16.100:6081/ HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
192.168.16.1 - - [09/Sep/2018:20:06:03 +0800] "GET http://192.168.16.100:6081/ HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
192.168.16.1 - - [09/Sep/2018:20:06:03 +0800] "GET http://192.168.16.100:6081/ HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"

这个日志显示的就和我们的httpd很相似, 也很简略.

  • varnishstat

varnishstat

这个结果也是即时刷新的.

  • varnishtop

varnishtop