在我们的例子中,HTTP 请求首先到达 Varnish 服务器,然后到达其两个后端之一。后端服务是一个flask+uwsgi应用程序。
我观察到,在流量高峰时段,清漆服务器会为某些请求返回间歇性的 503 响应代码,但数量非常少。在跟踪清漆上的此类请求时,我在清漆上发现了以下内容: *- FetchError HTC 状态 -1
我尝试增加后端应用程序的进程和线程数量,但这对 5xx 数字没有影响。 另一个观察结果是,大多数 5xx 请求的响应时间小于 1 毫秒,这意味着在任何情况下都不会超时。
任何人都可以提供一些关于这个问题的见解吗?预先感谢。
HTC status -1
错误有以下描述:
Unexpected end of input
这可能意味着后端在 Varnish 收到预期数据之前已断开连接。
我想查看这些错误情况的更详细的
varnishlog
输出。
您可以运行以下命令来捕获发生的获取错误:
sudo varnishlog -g request -q "FetchError"
您还可以转储完整的 VSL 内存缓冲区并查找出现提取错误但运行以下命令的早期事务:
sudo varnishlog -d -g request -q "FetchError"
我想查看以您所描述的方式失败的单个事务的完整日志。
如果您可以将该故障的时间戳与任何类型的 Web 服务器或应用程序错误/调试日志相匹配,那也会很有趣。
你的VCL后端有健康探测吗?如果是这样,我想查看以下命令的输出:
sudo varnishlog -g raw -i Backend_health
如果您没有健康探测器,最好定义一个。下面是一个 VCL 片段,说明了如何执行此操作:
probe health {
.url = "/check";
.interval = 5s;
.window = 5;
.threshold = 3;
.initial = 2;
}
backend one {
.host = "server1.example.com";
.port = "80";
.probe = health;
}
backend two {
.host = "server1.example.com";
.port = "80";
.probe = health;
}
有关后端运行状况探测器的更多信息,请访问 https://varnish-cache.org/docs/trunk/reference/vcl-probe.html。
后端健康检查将实时描绘当前后端健康状况,这是有用的信息。然而,真实日志事务和运行状况探测的结合是理想的。
如果您可以将这些后端问题与应用程序日志中的错误进行匹配,我们可能会找到根本原因。