nginx反向代理,免停机后台更新

我有一个tomcat实例服务请求,我有nginx作为这个tomcat实例的反向代理。

当我更新我的Java应用程序,大约需要10秒。 但是那些10秒的网站已经closures,nginx返回HTTP 503页面。

我希望nginx做的是:暂停所有传入的连接,直到后端启动。 然后开始为他们服务。 理想情况下做一些智能检查,例如“/”返回HTTP 200.在我看来,最好等待10秒,比看HTTP HTTP页面。

我不想为此集群。 我使用应用内caching,而我的Web应用程序远离高负载。 集群会引入很多我不想花费时间的问题。

我使用下面的指令连接到tomcat:

proxy_pass http://127.0.0.1:8080; 

如果您正在使用fastcgi与应用程序进行通信,请将fastcgi_read_timeoutfastcgi_connect_timeoutfastcgi_send_timeout设置为nginx“hold”客户端可以接受的所需值,并等待应用程序响应。 (即60秒)

浏览器将保持空白,直到应用程序响应,将等待最多60秒,以便抛出503(服务不可损失)或504(网关超时),但应用程序上的套接字/端口必须在高负载下侦听,否则nginx可以接收来自后端的“拒绝连接”并向客户端抛出503。 如果您的应用程序崩溃,删除套接字或closures侦听端口,我不能100%确定这些调整是否会对您有所帮助,但最好是configuration它们。

如果您通过代理与应用程序交谈,则正确variables的名称是proxy_read_timeoutproxy_connect_timeoutproxy_send_timeout

也许你只需要readconnect的。

最好的方法取决于tomcat提供的内容的性质。

  • 如果tomcat生成的内容无法在nginx上caching, proxy_connect_timeoutproxy_read_timeout增加到10s并使用上下文重新加载而不是重新启动tomcat(在上下文文件中设置reloadable=true或使用JMX / Tomcatpipe理器调用来强制webapp重新加载eg http://[hostname]:[port]/manager/reload?path=[/path/to/your/webapp] )。

  • 如果由tomcat生成的内容可以caching在nginx的一端,那么你可以采取以前的过程,但将超时设置为一些合理的值。 然后将更多东西投入到您的configuration中:同时使用proxy_cache_use_staleproxy_cache_lockproxy_cache_lock_timeout为访问者提供陈旧的页面,同时允许一次请求尝试更新caching,从而避免应用程序重新部署时出现更高的响应时间。

你也可以寻找第三方模块upstream_check_module (或使用像本地实现这一点的tengine叉)更智能的healtcheck。

如果你能负担得起,你也可以使用名为nginx plus的nginx商业版本,它使用health_checkmatch指令本地实现(并允许更智能的http检查条件)。