如何在后台升级期间挂起Nginx请求

我希望Nginx暂时(暂停)短暂的HTTP请求,而我升级或重新启动后端服务,执行数据库迁移或其他pipe理任务,而不会导致最终用户的错误。

基本上我想要做以下一系列的操作:

  1. 告诉Nginx停止将请求转发到我的后端,而不是将它们保存在其asynchronous队列中;
  2. 等到所有待处理的后端请求完成后再通知;
  3. 升级,重启或以其他方式对空闲的后端服务进行操作;
  4. 使用其私有地址快速validation后端服务是否正常运行;
  5. 打开Nginx的防洪门,让所有未决的请求通过。

理想情况下,这可以让我执行需要对整个后端服务器进行独占访问的pipe理任务,例如重新启动,升级或迁移,而不会导致最终用户比延迟更严重,希望不到一分钟。

我已经find了这个解决scheme ,但是这不是解决问题的第二点。而且,它需要将Lua解释器编译到Nginx中,这可能意味着任何内存泄漏和安全问题。

有没有任何configuration技巧或Nginx的模块专门针对这个问题? 可以用Nginx的库存来完成,也许可以通过testing控制文件的存在吗?

其他pipe理员如何解决这个问题呢?

(我知道uWSGI应用程序服务器的全function和有点庞大,在其他数百个应用服务器中有这个function,但是我宁愿避免在Nginx和后端之间引入另一个元素。)

您可以configurationnginx来执行一个脚本,以通过使用502 BAD GATEWAY和/或503 SERVICE UNAVAILABLE上的error handlingbutton并将http调用传递给某个队列进程,如beanstalkd。 (当您的后端服务不可用时出错)。

然后,在后台升级之后,popupbeanstalkd的请求,并将它们处理到您的后端服务。

此外,如果您的后端服务无意中断了,这可能会成为高可用性解决scheme的两倍,从而不会丢失API调用。 设置一个jenkins / cron来自动检查和处理任何beanstalk队列。

我想你正在处理维修scheme,停机时间最短。

我build议你使用备份服务器来保存所需秒数<20>(或)甚至<100>的请求,并在应用程序重新启动后redirect到原始URI。

您可以按照下面的nginx线程,解决scheme共享。

http://forum.nginx.org/read.php?2,177,177#msg-177

我从来没有做过,但如果我曾经尝试过,我想我会使用防火墙。 我可能需要脚本解决scheme,这将是这样的:

  1. 告诉防火墙允许现有连接,但要过滤端口80(或443)上的新连接。
  2. 等待挂起的请求到后端完成(即使nginx连接到客户端仍然打开)。
  3. 升级,重新启动,不pipe。
  4. 告诉防火墙再次允许连接。

如果步骤2 + 3不需要太长时间,则客户将在步骤4中重试并最终设法连接。如果时间过长,客户端将超时,但这不是问题,因为用户的耐心会有超时了,不?

解决scheme有一些捕获。 客户端可以设法获取主页面,然后可能无法继续获取静态文件(而您可能会考虑到这一点)。 但是,如果您从另一台机器或CDN提供静态文件,这不会成为问题。

另外,我相信只有在已经build立了一些高可用性解决scheme之后,有人才会担心自己的担心,例如两台服务器加上一个可以从一台服务器移到另一台服务器的IP地址。 将IP地址从一台服务器移到另一台服务器时,已断开连接的用户将断开连接。 我认为这是可以接受的,因为这些用户在他们的浏览器上得到了一个空白页面,想知道发生了什么,点击重新加载,这次它工作,他们不再打扰, 他们几分钟后甚至不记得这件事。 使用防火墙技巧来避免这种断开会产生比解决问题更多的问题,因为需要修改步骤2来等待nginx完成对客户端的服务请求,而且如果用户连接速度慢,这可能需要很长时间。 无论如何,我认为高可用性有太多的问题,所以这样做的优先级太低,以致永远不会做(除非你是Google或其他)。