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

相關內容