Nginx 延迟绑定

Nginx 延迟绑定

我在 Debian 上使用 nginx,并且有一个配置为

server {
  listen 172.30.0.172 deferred;
}

当我测试 nginx 配置时,我仍然得到

[emerg] bind() to 172.30.0.172:443 failed (99: Cannot assign requested address)

它是一个 SSL 主机,并使用 Pacemaker 实现 HA,因此我需要能够推迟绑定

答案1

如果我理解正确的话,您正在尝试让 nginx 在启动时监听本地机器上可能存在或不存在的 IP,对吗?

如果是这样,那么解决方案就在 nginx 之外,因为 Linux 内核不允许此操作。

要允许进程绑定到不存在的 IP,请设置 net.ipv4.ip_nonlocal_bind sysctl。在 Debian/Ubuntu 上,您可以执行以下操作:

echo net.ipv4.ip_nonlocal_bind=1 | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

答案2

延期选项不会推迟套接字 bind(),而是推迟 accept(),因此这不是您想要的。我不知道有任何 Web 服务器明确提供此功能,无论如何,您都需要向 Web 服务器发出绑定信号。最好的选择是简单地绑定到 0.0.0.0,这样当时连接的 IP 地址就无关紧要了。如果这真的不可能,并且 nginx 启动所需的时间比您在故障转移时所能承受的时间要长(这让我很惊讶),那么您唯一的选择是首先启动它在不同的 IP 上进行监听,然后在故障转移时更改配置文件并发送 nginx SIGHUP 以重新加载其配置。

答案3

根据 nginx 作者 Igor Sysoev 的回复(俄语)他认为与 apache 相比,deffer 和 accept_filters 对 nginx 来说都没什么用。他指出,对于这类连接,没有设置超时,因此只有在溢出时才会关闭,这意味着如果将 backlog 设置为 10000,则大约 15000 个套接字将被浪费为处于“挂起”状态的空闲状态。

答案4

您想要监听特定 IP 的原因是什么?监听所有 IP 会简单得多。无论如何,只有当 HA 启动并且备份成为主 IP 时,它才会获得流量。

相关内容