当我重启服务器(不是 nginx,而是整个服务器)时,Nginx 无法自动启动。登录服务器后,我可以手动启动 nginx(service nginx start)。这样就可以了。但如果我再次重启,就必须手动启动 Nginx。检查 Nginx 的 error.log 时,我发现这个错误重复了好几次:
2012/08/27 09:19:23 [emerg] 1066#0: bind() to [ipv6]:80 failed (99: Cannot assign requested address)
我该如何修复这个问题?这是什么问题?(我正在运行 Ubuntu 12.04 服务器)
答案1
bind() 至 [ipv6]:80 失败 (99: 无法分配请求的地址)
听起来你的 IPv6 地址刚刚被分配给 eth0,并且仍然在暂定状态,因此 Nginx 无法在该 IP 上建立监听。
无论是 DAD 的回合(重复地址检测)通过运行:
sysctl -w net.ipv6.conf.eth0.dad_transmits=0
(插入/etc/sysctl.conf
永久)
或者将此行添加到/etc/network/interfaces
inet6 接口定义下
post-up while ip -6 addr show tentative | grep . > /dev/null ; do sleep 1 ; done
来源:http://pyro.eu.org/how-to/micro/nginx-cannot-assign-requested-address-ipv6.txt
答案2
我有类似的症状,但配置不同。服务器运行 Debian Wheezy,配置了静态 IPv4 和 IPv6 地址。
# /etc/network/interfaces
auto lo eth0
iface lo inet loopback
iface eth0 inet static
address 192.0.2.3
netmask 255.255.255.0
gateway 192.0.2.1
iface eth0 inet6 static
address 2001:db8::3
netmask 64
gateway 2001:db8::1
每次启动时,nginx 都无法启动:
bind() to [2001:db8::3]:80 failed (99: Cannot assign requested address)
手动启动工作正常,手动检查也显示地址和路由已设置。只需设置 IPv6 地址interfaces
(不设置 IPv4 地址)即可。删除静态 IPv6 网关也有效,但随后会使用链路本地网关地址。经过进一步调试,我发现启动过程会显示:
RTNETLINK answers: File exists
Failed to bring up eth0.
事实证明,当接口启动时,路由器会自动分配 IPv6 地址和网关。为了避免此行为,请accept_ra 0
在iface eth0 inet6
部分中设置。inet6
还必须将部分移到部分之前inet
,否则默认路由仍将指向链路本地地址。
答案3
在我的 Ubuntu 14.04 主机上,我只需要将 IPv6(inet6)条目移到 IPv4(inet)条目之前。
因此这是可行的:
auto eth0
iface eth0 inet6 static
address fd57:c87d:f1ee:2::6
netmask 64
up /sbin/ip -6 route add fd57:c87d:f1ee::/48 via fe80::1 dev $IFACE
iface eth0 inet static
address 10.0.3.29
netmask 255.255.255.0
gateway 10.0.3.1
dns-nameserver 10.0.3.1