我当前的设置是 nginx 作为负载均衡器,位于一堆上游服务器的前面。
我希望能够在不改变用户体验的情况下进行部署。这意味着不会出现 502 错误,也不会增加页面时间。
我的理解是,当nginx -s reload
发出时,nginx 将正常生成新线程来处理新配置的新连接,但仍将完成处理重新加载时正在进行的请求。此外,我曾在某处读到,将上游标记为上游块down
并重新加载将使上游脱离轮换,但仍将完成与其进行的任何正在进行的连接。
以上内容全部正确吗?
当前的计划是在 nginx 主机中运行一个小进程,该进程基本上会改变 nginx 配置,并在通过内部 REST API 要求时发出这些优雅的重新加载。
然后,在每个上游的正常关闭和启动/预热完成后,我的部署工具将连接该进程并按顺序从 nginx 配置中添加/删除我的上游。
这有意义吗?其他人是怎么做的?有没有现成的工具可以实现这一点?
我搜索这方面的信息时运气不太好......
答案1
是的,您的想法是正确的,nginx 在重新加载时会继续处理当前请求,并会使用新的配置开始处理新请求。
http://nginx.org/en/docs/beginners_guide.html#control
旧工作进程收到关闭命令后,将停止接受新连接并继续处理当前请求,直到处理完所有请求。 此后,旧工作进程退出。
将上游标记为与down
将其从配置中删除没有太大区别。在这两种情况下,它都不会接受新请求。
我们经常重新加载 nginx 配置(使用 coghttps://nedbatchelder.com/code/cog/)并且就代理而言,它不会导致任何停机,因为上游位置。只要上游本身已准备好处理请求,就不会出现停机。