Nginx 启动失败。无法分配请求的地址?

Nginx 启动失败。无法分配请求的地址?

当我重启服务器(不是 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/interfacesinet6 接口定义下

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 0iface 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

相关内容