我希望Nginx暂时(暂停)短暂的HTTP请求,而我升级或重新启动后端服务,执行数据库迁移或其他pipe理任务,而不会导致最终用户的错误。
基本上我想要做以下一系列的操作:
理想情况下,这可以让我执行需要对整个后端服务器进行独占访问的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共享。
我从来没有做过,但如果我曾经尝试过,我想我会使用防火墙。 我可能需要脚本解决scheme,这将是这样的:
如果步骤2 + 3不需要太长时间,则客户将在步骤4中重试并最终设法连接。如果时间过长,客户端将超时,但这不是问题,因为用户的耐心会有超时了,不?
解决scheme有一些捕获。 客户端可以设法获取主页面,然后可能无法继续获取静态文件(而您可能会考虑到这一点)。 但是,如果您从另一台机器或CDN提供静态文件,这不会成为问题。
另外,我相信只有在已经build立了一些高可用性解决scheme之后,有人才会担心自己的担心,例如两台服务器加上一个可以从一台服务器移到另一台服务器的IP地址。 将IP地址从一台服务器移到另一台服务器时,已断开连接的用户将断开连接。 我认为这是可以接受的,因为这些用户在他们的浏览器上得到了一个空白页面,想知道发生了什么,点击重新加载,这次它工作,他们不再打扰, 他们几分钟后甚至不记得这件事。 使用防火墙技巧来避免这种断开会产生比解决问题更多的问题,因为需要修改步骤2来等待nginx完成对客户端的服务请求,而且如果用户连接速度慢,这可能需要很长时间。 无论如何,我认为高可用性有太多的问题,所以这样做的优先级太低,以致永远不会做(除非你是Google或其他)。