我们遇到过这样一种情况:某个站点开始提供 502 Bad Gateway,但在上游服务器恢复后似乎无法恢复。nginx 服务器设置为代理/负载平衡两个上游服务器的请求。看起来数据库服务器将开始获得较高的平均负载,导致 Web 服务器(上游服务器)缓慢地提供内容并超时(根据 nginx 服务器)。然后 Nginx 将提供 502,考虑到这种情况,这是有道理的。
但奇怪的是,nginx 似乎无法识别 Web 服务器何时反弹,我们必须重新启动 nginx 才能让它再次开始为网站提供服务。有没有好的办法来解决这个问题?我正在查看代理设置,看看是否有需要设置的东西,但没找到任何东西。
查看 nginx 日志,我们看到类似的条目(仅提取此时间范围内的三个错误示例):
2013/06/12 13:53:40 [error] 29840#0: *258391 upstream timed out (110: Connection timed out) while reading response header from upstream, client: n.n.n.n, server: www.example.org, request: "GET / HTTP/1.1", upstream: "http://n.n.n.n:80/", host: "www.example.org"
2013/06/12 13:54:11 [error] 29840#0: *261105 no live upstreams while connecting to upstream, client: n.n.n.n, server: www.example.org, request: "GET /HTTP/1.1", upstream: "http://example_rack/", host: "www.example.org"
2013/06/12 13:54:46 [alert] 29840#0: *261470 stalled cache updating, error:0 while closing request, client: n.n.n.n, server: n.n.n.n:80
答案1
此答案描述了与标题和描述相匹配的问题的解决方案。这不是试图回答 Rob 9 年后的问题,希望它能对其他人有所帮助。该解决方案是在 Docker 上下文中提供的,但可能适用于任何 nginx 配置。
在我们的案例中上游服务器的 IP 地址在重启期间发生变化,可能是因为旧服务直到新服务启动时才被撤下。
我们偶然发现了这个 ServerFault邮政我们从中得到以下提示:
第一个答案: “当您使用变量在 proxy_pass 指令中指定域名时,NGINX 会在域名 TTL 过期时重新解析该域名。您必须包含 resolver 指令来明确指定名称服务器”
这同一主题中的第二个答案链接我们详细的例子:
resolver 172.16.0.23;
set $upstream_endpoint http://service-1234567890.us-east-1.elb.amazonaws.com;
location / {
proxy_pass $upstream_endpoint;
}
查看文章对于警告。