配置nginx以重试单个上游服务器


12

我正在使用nginx作为反向代理,如果上游服务器没有响应,我希望它等待几秒钟并重试请求。这样我可以重新启动我的上游服务器,而不是用户看到502坏网关,他们的浏览器只挂几秒钟(重启过程需要3或4秒)。我尝试了几件事,我把它放在我的服务器块中:

proxy_connect_timeout 60;
proxy_send_timeout 15;
proxy_read_timeout 20;

但它似乎没有做任何事情。我也尝试将其添加到上游块:

server 127.0.0.1:3001 fail_timeout=10s;

再次,不是我想要的。

这可能吗?我错过了什么?

Answers:


1

您尝试的指令意味着与您希望的不同。阅读他们的文档。

upstream指令的文档详细地介绍了上游块是如何工作的:

如果在与服务器通信期间发生错误,请求将被传递到下一个服务器,依此类推,直到将尝试所有正常运行的服务器。如果无法从任何服务器获得成功的响应,则客户端将接收与最后一个服务器的通信结果。

一切都在那里说。

但是,您可以通过拦截它来处理从后端返回的错误代码proxy_intercept_errors,然后将其发送$request_uri到代表原始客户端处理它的特殊脚本。

基线是:您需要一些代码/应用程序逻辑来重试客户端(或前端端)。


0

正如另一个答案所述,没有内置的方法让nginx这样做。一种可能的解决方案是使用由当前服务器组成的负载平衡设置,以及为所有请求执行以下操作的备份服务器:

  • 轮询您当前的服务器,直到它重新联机
  • 然后使用302或其他重定向进行响应,以便浏览器再次尝试

此服务器将标记为“backup”标志,以便仅在所有其他服务器脱机(HTTP负载平衡>服务器权重)时尝试使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.