Varnish 上间歇性 503 响应

问题描述 投票:0回答:1

在我们的例子中,HTTP 请求首先到达 Varnish 服务器,然后到达其两个后端之一。后端服务是一个flask+uwsgi应用程序。

我观察到,在流量高峰时段,清漆服务器会为某些请求返回间歇性的 503 响应代码,但数量非常少。在跟踪清漆上的此类请求时,我在清漆上发现了以下内容: *- FetchError HTC 状态 -1

  • 后端关闭 32 reload_2024-09-18T174244.ml1
  • Beresp 状态 503
  • BerespReason 服务不可用
  • BerespReason 后端获取失败

我尝试增加后端应用程序的进程和线程数量,但这对 5xx 数字没有影响。 另一个观察结果是,大多数 5xx 请求的响应时间小于 1 毫秒,这意味着在任何情况下都不会超时。

任何人都可以提供一些关于这个问题的见解吗?预先感谢。

python flask uwsgi server-side varnish
1个回答
0
投票

根据https://github.com/varnishcache/varnish-cache/blob/1a79fde343ebd9f7210ea2489df6e9730940653f/include/tbl/htc.h#L41

HTC status -1
错误有以下描述:

Unexpected end of input

这可能意味着后端在 Varnish 收到预期数据之前已断开连接。

失败事务的 Varnishlog

我想查看这些错误情况的更详细的

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

后续步骤

后端健康检查将实时描绘当前后端健康状况,这是有用的信息。然而,真实日志事务和运行状况探测的结合是理想的。

如果您可以将这些后端问题与应用程序日志中的错误进行匹配,我们可能会找到根本原因。

© www.soinside.com 2019 - 2024. All rights reserved.