我的服务器上部署了一个负载均衡器/反向代理(nginx 或 cherokee,无论哪个都可以),它以循环设置的方式指向多个后台 Web 服务器进程(gunicorn 或 cherrypy,无论哪个都可以)。
为了最大限度地减少停机时间,我有一个 Web 服务器重启脚本,它会终止一个特定的 Web 服务器进程(假设是 8 个进程中的),然后立即重新启动它;然后转到下一个 Web 服务器进程(终止它,然后重新启动它),因此在任何时间点,总会有至少 7 个进程可供我的反向代理指向。
这很好;但是有没有办法“完善”这个过程,以便我根本不会收到 502 Bad gateway? 当用户恰好在网站上并使用被暂时终止并恢复的 Web 服务器进程时,就会发生 502 网关错误。
显然,我需要重启脚本的原因是为了在我的 Python 应用程序中部署新的 Python 代码(在 gunicorn 或 cherrypy 上运行)。
答案1
nginx 应该可以做到这一点。 proxy_next_upstream如果所选的初始服务器无法访问,则默认error timeout
设置将把请求传递给上游块的下一个成员。
答案2
你为什么要杀死 gunicorn?只需像任何其他行为良好的 Unix 进程一样向它发送 SIGHUP,它就会愉快地重新加载而不会丢失任何连接。
答案3
如果您使用 haproxy 并为每个 Web 服务器进程配置一个后端,同时对这些后端使用健康检查,它将检测出某个后端何时关闭并将其标记为离线,从而将请求平衡到健康的后端。
连接到重新启动的 Web 服务器的用户在刷新页面或发起另一个请求后,应重新平衡到正常运行的 Web 服务器。
答案4
使用Apache httpd反而。
它有一个超可配置的反向代理负载均衡器支持成员流失和加权偏好,更不用说通过平衡器管理器接口进行在线重新配置。