重新启动nginx后端而不会丢失请求

我确定以前用过不同的语言,但是我通过nginx后面的uwsgi(emporer模式)运行了几个Django站点。 这是一个相当标准的configuration,但我发现,如果我重新启动中央uwsgi进程,nginx只是炸弹了502s,而不是等待套接字变得可用。

我承认这其中的大部分可能是有原因的,但是看到502错误的人确实会刺痛我。 这当然不是我想让客户看到的东西。 所以…

  • 我可以求nginx等待/重试后端? 要么,
  • 有什么(除了明显的)我可以做到最小化从uwsgi重新启动的商业损失?

一个想法是用自动刷新客户端的页面replacenginx的默认502模板。 你基本上只需要在头文件中创build一个新的<meta http-equiv="refresh" content="5">的文件。 给它一些友好的文字,解释该网站目前正在维护(或一些equiv BS),并从你的nginxconfiguration链接到它:

 error_page 502 /502.html; location = /502.html { root /var/www/502.html; } 

你需要在所有的网站上(可能有这样做的全球方式),但结果是任何人会看到一个网关超时现在将看到一个页面,看起来并不特别奇怪,并会在五秒钟内,把它们放在他们原来想要的页面上。

这一切都假设后端将回来。 如果有机会无限期地closures,你可能想写一些JS检查URL本身,并有一个重试计数器。 所有相当简单,但它可能安抚客户谁是越来越恼火的网站被closures。

只是一个想法,如果可能的话既不testing也不确定:

如果你在nginx中configuration多个上游服务器,所有的服务器都指向同一个uWSGI实例呢? 如果nginx与uwsgi通信失败,它会发送请求到下一个上游(proxy_next_upstream指令在这里帮助吗?),它实际上是相同的,但可能已经到了。