當我重新啟動伺服器(不是 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