我在 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 时,它才会获得流量。