我偶尔会遇到难以确定的 503 错误。Varnishlog 让我抓狂,因为我似乎无法从中获取我想要的信息。
我希望看到 Varnish 看到的客户端和后端通信。我认为 XID 号(记录在 Varnish 的默认错误页面上)可以让我从日志缓冲区中过滤出确切的请求。但是,没有任何 varnishlog 参数组合能给我所需的输出。
以下仅展示客户端通信:
varnishlog -d -c -m ReqStart:1427305652
而这只显示了最终的后端通信:
varnishlog -d -b -m TxHeader:1427305652
是否有一行代码可以显示整个请求?
答案1
TxHeader
因为在与客户端通信时XID 也会出现在标记行中:
12 SessionOpen c 127.0.0.1 33829 :80
12 ReqStart c 127.0.0.1 33829 1171098618
12 RxRequest c GET
12 RxURL c /
12 RxProtocol c HTTP/1.1
12 RxHeader c Host: ganglia.gentoo
12 RxHeader c User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0
12 RxHeader c Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
12 RxHeader c Accept-Language: en-us
12 RxHeader c Accept-Encoding: gzip, deflate
12 RxHeader c Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
12 RxHeader c Connection: keep-alive
12 VCL_call c recv lookup
12 VCL_call c hash
12 Hash c /
12 Hash c ganglia.gentoo
12 VCL_return c hash
12 HitPass c 1171098616
12 VCL_call c pass pass
12 Backend c 13 apache apache
12 TTL c 1171098618 RFC 120 -1 -1 1317921851 0 1317921851 0 0
12 VCL_call c fetch
12 TTL c 1171098618 VCL 120 -1 -1 1317921851 -0
12 VCL_return c hit_for_pass
12 ObjProtocol c HTTP/1.1
12 ObjResponse c OK
12 ObjHeader c Date: Thu, 06 Oct 2011 17:24:11 GMT
12 ObjHeader c Server: Apache
12 ObjHeader c Content-Length: 17
12 ObjHeader c Content-Type: text/html
12 VCL_call c deliver deliver
12 TxProtocol c HTTP/1.1
12 TxStatus c 200
12 TxResponse c OK
12 TxHeader c Server: Apache
12 TxHeader c Content-Type: text/html
12 TxHeader c Content-Length: 17
12 TxHeader c Accept-Ranges: bytes
12 TxHeader c Date: Thu, 06 Oct 2011 17:24:11 GMT
12 TxHeader c X-Varnish: 1171098618
12 TxHeader c Age: 0
12 TxHeader c Via: 1.1 varnish
12 TxHeader c Connection: keep-alive
12 Length c 17
12 ReqEnd c 1171098618 1317921851.307137489 1317921851.344322681 0.000065327 0.037110329 0.000074852
正如@Oneiroi提到的,根据man page
:
-b Include log entries which result from communication with a backend server. If neither -b nor -c
is specified, varnishlog acts as if they both were.
-c Include log entries which result from communication with a client. If neither -b nor -c is speci‐
fied, varnishlog acts as if they both were.
那么,尝试一下这个:
varnishlog -d -m TxHeader:XID | awk '$1 !~ /0/ { print $0 }'
样本结果:
varnishlog -d -m TxHeader:1171098618 | awk '$1 !~ /0/ { print $0 }'
13 BackendOpen b apache 127.0.0.1 40207 127.0.0.1 8080
13 TxRequest b GET
13 TxURL b /
13 TxProtocol b HTTP/1.1
13 TxHeader b Host: ganglia.gentoo
13 TxHeader b User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0
13 TxHeader b Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
13 TxHeader b Accept-Language: en-us
13 TxHeader b Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
13 TxHeader b X-Forwarded-For: 127.0.0.1
13 TxHeader b Accept-Encoding: gzip
13 TxHeader b X-Varnish: 1171098618
13 RxProtocol b HTTP/1.1
13 RxStatus b 200
13 RxResponse b OK
13 RxHeader b Date: Thu, 06 Oct 2011 17:24:11 GMT
13 RxHeader b Server: Apache
13 RxHeader b Content-Length: 17
13 RxHeader b Content-Type: text/html
13 Fetch_Body b 4 0 1
13 Length b 17
13 BackendReuse b apache
12 SessionOpen c 127.0.0.1 33829 :80
12 ReqStart c 127.0.0.1 33829 1171098618
12 RxRequest c GET
12 RxURL c /
12 RxProtocol c HTTP/1.1
12 RxHeader c Host: ganglia.gentoo
12 RxHeader c User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0
12 RxHeader c Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
12 RxHeader c Accept-Language: en-us
12 RxHeader c Accept-Encoding: gzip, deflate
12 RxHeader c Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
12 RxHeader c Connection: keep-alive
12 VCL_call c recv lookup
12 VCL_call c hash
12 Hash c /
12 Hash c ganglia.gentoo
12 VCL_return c hash
12 HitPass c 1171098616
12 VCL_call c pass pass
12 Backend c 13 apache apache
12 TTL c 1171098618 RFC 120 -1 -1 1317921851 0 1317921851 0 0
12 VCL_call c fetch
12 TTL c 1171098618 VCL 120 -1 -1 1317921851 -0
12 VCL_return c hit_for_pass
12 ObjProtocol c HTTP/1.1
12 ObjResponse c OK
12 ObjHeader c Date: Thu, 06 Oct 2011 17:24:11 GMT
12 ObjHeader c Server: Apache
12 ObjHeader c Content-Length: 17
12 ObjHeader c Content-Type: text/html
12 VCL_call c deliver deliver
12 TxProtocol c HTTP/1.1
12 TxStatus c 200
12 TxResponse c OK
12 TxHeader c Server: Apache
12 TxHeader c Content-Type: text/html
12 TxHeader c Content-Length: 17
12 TxHeader c Accept-Ranges: bytes
12 TxHeader c Date: Thu, 06 Oct 2011 17:24:11 GMT
12 TxHeader c X-Varnish: 1171098618
12 TxHeader c Age: 0
12 TxHeader c Via: 1.1 varnish
12 TxHeader c Connection: keep-alive
12 Length c 17
12 ReqEnd c 1171098618 1317921851.307137489 1317921851.344322681 0.000065327 0.037110329 0.000074852
答案2
从手册页中:
包含与客户端通信产生的日志条目。如果未指定 -b 或 -c,varnishlog 将视为两者都指定。
理论上否定添加 -c 或 -b应该检索整个交易。
答案3
从 Varnish 5.1 开始:
varnishlog -d -g session -q 'vxid == 1427305652'
看https://varnish-cache.org/docs/trunk/whats-new/changes-5.1.html#vxid-in-vsl-queries