Есть ли аналог net.ipv4.ip_nonlocal_bind для ipv6? Мне нужно запустить мой nginx при загрузке с такого IP ...
В моем Ubuntu этот IPv6 не назначается на eth0 достаточно быстро, несмотря на этот / etc / network / interface:
iface eth0 inet6 static
address 1:2:3:4::5
netmask 64
Во время загрузки:
Starting nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
[emerg]: bind() to [1:2:3:4::5]:80 failed (99: Cannot assign requested address)
Мне нужно бежать /etc/init.d/nginx restart
через несколько секунд после загрузки, чтобы все заработало: - /
NB: 1: 2: 3: 4 :: 5 используется здесь только для демонстрации, у меня есть действующий IPv6-адрес на моем сервере.
В net.ipv6.ip_nonlocal_bind
sysctl был добавлен в ядро 4.3, поэтому, если вы используете более передовую систему, теперь вы можете решить эту проблему напрямую с помощью sysctl, вместо того, чтобы обойти проблему с помощью хаков сценария инициализации.
Задержка, скорее всего, связана с Обнаружение повторяющегося адреса IPv6. Отключение этого параметра (конечно) нарушит стандарт, но вы можете попробовать установить net.ipv6.conf.eth0.dad_transmits
до 0 (по умолчанию 1 в моей системе Ubuntu):
sysctl -w net.ipv6.conf.eth0.dad_transmits=0
Чтобы сделать постоянным:
sudo /bin/bash -c 'echo "net.ipv6.conf.eth0.dad_transmits=0" > /etc/sysctl.d/99-disable-dad-eth0.conf'
Конечно, другой вариант - просто привязать к ::
(IPv6 all-zeroes или любой IPv6-адрес) и брандмауэр отключил службу на интерфейсах, которые не должны ее открывать.
Вы можете просто настроить запись статического IPv6-адреса на интерфейсе обратной связи. Это позволит nginx прослушивать IP / PORT, даже если адрес еще не доступен на eth0.
Руководство:
/sbin/ip -6 addr add 2001:db8::ffff:1/64 dev lo
Файл конфигурации:
# File: '/etc/network/interfaces'
auto lo
iface lo inet loopback
iface lo inet6 static
address 2001:db8::ffff:1
netmask 64
Поскольку кажется, что такого параметра ядра для ipv6 нет, вы можете взломать сценарий инициализации nginx и добавить:
grep -q eth0 /etc/network/run/ifstate || ifup eth0
где-то перед запуском команды nginx?
Или, если вам кажется, что вы используете debian или производную версию, вы можете попробовать изменить порядок своих сценариев инициализации по зависимости с помощью пакета insserv
и переключитесь на запуск параллельного сценария инициализации, установив переменную CONCURENCY=makefile
в /etc/default/rcS
(если вы используете Debian Squeeze, это конфигурация по умолчанию).
Я уверен, что вы решили свою проблему в какой-то момент за последние четыре года с момента публикации этого поста, но я закончил здесь, пытаясь найти решение для запуска nginx в системе CentOS 7 с поддержкой systemd с аналогичными проблемами, поэтому возможно, это поможет другим.
Мой nginx запускался до того, как сеть для IPv4 и IPv6 была запущена, из-за чего он не запускался и оставался отключенным. В RedHat есть ошибка, из-за которой systemd 'After' network-online.target устанавливается до включения IPv6, поэтому nginx выполняется до того, как он сможет привязаться к адресам IPv6 в своей конфигурации.
К сожалению, поскольку это ошибка, моим единственным вариантом было ввести вызов сна в определение службы systemd для nginx, чтобы он спал достаточно долго при загрузке, чтобы IPv6 работал.