我在Debian上使用nginx,并configuration了一个服务器
server { listen 172.30.0.172 deferred; }
当我testingnginxconfiguration我仍然得到
[emerg] bind() to 172.30.0.172:443 failed (99: Cannot assign requested address)
这是一个SSL主机,并使用起搏器为HA,因此,我需要能够推迟绑定
如果我的理解正确,你试图让nginx监听一个在nginx启动的时候本地机器上可能存在或者可能不存在的IP,对吗?
如果是这样,那么解决scheme在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
延迟选项不推迟套接字bind(),它延迟accept(),所以这不是你在找什么。 我不知道任何明确提供此function的networking服务器,在任何情况下,您都需要通知Web服务器何时进行绑定。 你最好的select是简单地绑定到0.0.0.0,这样就不用担心当时连接了什么IP地址。 如果这是不可能的,而且nginx启动的时间比在故障转移时所能承受的时间要长(这会让我感到意外),那么你唯一的select是首先启动它监听不同的IP,然后在故障转移时更改configuration文件并发送nginx SIGHUP来重新加载其configuration。
根据nginx作者Igor Sysoev的回复 (俄文版),他认为deffer和accept_filters对于nginx来说相当于对apache的负面影响。 他指出,对于这种连接,没有超时设置,所以只有在溢出时才closures,这意味着在backlog设置为10000时,大约有15000个套接字在空闲状态下将被浪费为“挂起”。
你有什么理由要听一个特定的IP? 倾听所有人的意见要简单得多。 无论如何,只有当HA启动并且备份成为主要时,才会获得stream量。