如何仅在部分工作人员上重新加载 nginx 配置?

如何仅在部分工作人员上重新加载 nginx 配置?

有什么方法可以防止 nginx 同时在所有工作进程上重新加载配置?我配置了一些非常短的超时,因此在负载较高时将工作进程数量加倍会导致 504 错误增加。我想通过逐个(或者可能是三个三个)交换工作进程来防止这种情况,但我找不到任何方法来实现这一点。

编辑:

在配置重新加载期间,nginx 将工作进程数量增加一倍:

在此处输入图片描述

我开发的 CDN 在计算缓存键时发出请求。这些请求的超时时间非常短(如果我没记错的话是 50 毫秒),因此它们对服务器负载的变化非常敏感。当配置重新加载频繁时,这些请求就会超时。我假设这是由额外的工作进程引起的,所以我想知道是否有可能同时仅在少数工作进程上重新加载配置。它可以像这样工作:

  • 创造n采用新配置的 worker
  • 停止分配新连接n使用旧配置的 Worker
  • 等到这些n老员工体面地退出
  • 重复此过程,直到没有更多具有旧配置的工人

我没有找到任何可以实现这种行为的选项,所以我认为这是不可能的。但我想确定一下。

答案1

我猜你误解了 nginx 的设计。

该 Web 服务器并不像 Apache 那样遵循每个连接一个进程的传统方案。

因此,添加比 CPU 核心数量更多的工作进程几乎没有用处,等于此机器属性的工作进程数是最有效的配置。

换句话说:在 Apache 时代,你由于 1 个进程 <=> 1 个连接,因此需要添加更多工作人员来处理更多流量。

现在,这个 nginx 只剩下 1 个连接 => 1 个进程的关系,但 1 个进程 => 1 个连接不再成立。nginx 的事件驱动设计允许每个工作进程接受多个连接,而不是等待(保持空闲)直到它完全忙碌(核心 CPU 使用率为 100%)。

基线是:如果配置正确,则不需要更改 nginx 实例的工作程序数量(参见worker_processesauto通常就足够了)。如果所有工人都饱和了,那么机器属性就会成为瓶颈(CPU、I/O),因此添加新工人不会有太大作用,只会加剧问题。

现在,对于您想要“逐个交换工作者”的部分,nginx 的主控将套接字分配给工作者,因此您不知道您影响了哪些请求/客户端。

想象一下,如果在一个组中同时生成(和死亡)。您可以使用即时升级nginx 的功能。然后,您可以通过信号与主服务器通信,无缝且几乎即时地在不同配置之间切换。

强烈建议你继续阅读nginx 的设计清楚了解自己正在处理的问题以及为什么自己的要求没有得到满足。

你没有说明你的真实意图,所以我只能提供你问的确切问题。如果你告诉社区你想要实现的目标,可能会有一组更简单的问题/答案。

相关内容