サーバーを再起動すると (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
[ipv6]:80へのbind()が失敗しました(99:要求されたアドレスを割り当てることができません)
IPv6アドレスがeth0に割り当てられたばかりで、まだ暫定的な状態したがって、Nginx はその IP で listen を確立できません。
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
私も同様の症状がありましたが、構成が異なっていました。サーバーは、静的 IPv4 および IPv6 アドレスが構成された Debian Wheezy を実行しています。
# /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