Когда я перезагружаю свой сервер (не nginx, а весь сервер), Nginx не запускается автоматически. После того, как я вошел на сервер, я могу запустить nginx вручную (service nginx start). Он работает. Но если я снова перезагружу, мне придется вручную запускать Nginx. При проверке error.log для Nginx я увидел эту ошибку, повторенную несколько раз:
2012/08/27 09:19:23 [emerg] 1066#0: bind() to [ipv6]:80 failed (99: Cannot assign requested address)
Как это исправить? В чем проблема? (У меня сервер Ubuntu 12.04)
решение1
bind() to [ipv6]:80 не удалось (99: невозможно назначить запрошенный адрес)
Похоже, ваш адрес IPv6 только что был назначен на eth0 и все еще находится в сетипредварительное состояние, поэтому Nginx не может установить прослушивание на этом IP-адресе.
Либо поворот ПАПА (Обнаружение дубликатов адресов) запустив:
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)
Ручной запуск работает нормально, и ручная проверка также показала, что адреса и маршруты установлены. interfaces
Сработала только установка адреса IPv6 (без адреса IPv4). Удаление статического шлюза IPv6 также сработало, но тогда используется адрес шлюза link-local. После дальнейшей отладки я обнаружил, что процесс загрузки выдает:
RTNETLINK answers: File exists
Failed to bring up eth0.
Оказывается, IPv6-адрес и шлюз автоматически назначаются маршрутизатором при запуске интерфейса. Чтобы избежать этого поведения, установите accept_ra 0
в iface eth0 inet6
разделе. inet6
Раздел также должен быть перемещен перед inet
разделом, иначе маршрут по умолчанию все равно будет указывать на адрес link-local.
решение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