我使用 nginx 作为反向代理,如果上游服务器没有响应,我希望它等待几秒钟并重试请求。这样我就可以重新启动上游服务器,用户就不会看到 502 bad gateway,他们的浏览器只会挂起几秒钟(重新启动过程需要 3 或 4 秒)。我尝试了几件事,我把它放在我的服务器块中:
proxy_connect_timeout 60;
proxy_send_timeout 15;
proxy_read_timeout 20;
但似乎什么也没做。我还尝试将其添加到上游块:
server 127.0.0.1:3001 fail_timeout=10s;
再次,这不是我想要的。
这可能吗?我遗漏了什么?
答案1
正如另一个答案所述,没有内置方法可以让 nginx 执行此操作。一种可能的解决方案是使用由当前服务器和对所有请求执行以下操作的备份服务器组成的负载平衡设置:
- 轮询当前服务器,直到其重新上线
- 然后使用 302 或其他重定向进行响应,以便浏览器再次尝试
该服务器将被标记为“备份”标志,以便只有当所有其他服务器都离线时才会尝试(HTTP 负载平衡 > 服务器权重)。
答案2
您尝试的指令的目的与您期望的目的不同。请阅读其文档。
这upstream
指令文档详细解释了上游块的工作原理:
如果在与某个服务器通信时发生错误,请求将被传递到下一个服务器,依此类推,直到尝试完所有正常运行的服务器。如果无法从任何服务器获得成功响应,客户端将收到与最后一个服务器通信的结果。
一切都在那里说。
但是,你也许能够通过拦截后端返回的错误代码来处理它proxy_intercept_errors
然后发送$request_uri
使用特殊脚本来代表原始客户处理该问题。
基线是:您需要一些代码/应用程序逻辑来重试客户端(或前端)。