Назад | Перейти на главную страницу

Nginx и NSD3 не запускаются при загрузке, потому что они не могут использовать назначенный IP

Сервер - это Xen VPS под управлением Ubuntu 12.04, и ни nginx, ни NSD3 не запускаются после перезагрузки. Очевидная причина этого в том, что они не могут привязаться к назначенным им IP-адресам сразу после загрузки.

из /var/log/boot.log

* Starting configure network device                                     [ OK ]
* Stopping save kernel messages                                         [ OK ]
* Starting MTA                                                          [ OK ] 
nginx: [emerg] bind() to [2a01:1b0:removed:1c9c]:80 failed (99: Cannot assign requested address)
* Starting nsd3...                                                      [ OK ] 
[...]
* Starting configure virtual network devices                            [ OK ]
* Stopping configure virtual network devices                            [ OK ]

из /var/log/nsd.log

[1351715473] nsd[956]: error: can't bind udp socket: Cannot assign requested address
[1351715473] nsd[956]: error: server initialization failed, nsd could not be started

Через пару секунд все работает нормально, и nginx и NSD3 могут быть запущены.

Мне кажется, что проблема в неправильном порядке загрузки, nginx и NSD3 запускаются до полной настройки сети. Я обошел это, поставив

# nginx and nsd boot fix
sleep 4
/etc/init.d/nsd3 start
/etc/init.d/nginx start

в /etc/rc.local, но это неправильное решение. Как правильно решить эту проблему?

Вот моя базовая конфигурация сети, из / etc / network / interfaces auto eth0

iface eth0 inet static
  address 89.removed.121
  gateway 89.removed.1
  netmask 255.255.255.0

iface eth0 inet6 static
  up echo 0 > /proc/sys/net/ipv6/conf/all/autoconf
  up echo 0 > /proc/sys/net/ipv6/conf/default/autoconf
  netmask 64
  gateway 2a01:removed:0001
  address 2a01:removed:7c3b
  up ip addr add 2a01:removed:62bd dev eth0 preferred_lft 0
  up ip addr add 2a01:removed:ce6d dev eth0 preferred_lft 0
  up ip addr add 2a01:removed:3e13 dev eth0 preferred_lft 0
  up ip addr add 2a01:removed:1c9c dev eth0 preferred_lft 0

auto lo
iface lo inet loopback

Эти неудобные id addr существуют потому, что я хотел добавить дополнительные IP-адреса, но все же использовать первый для всего трафика, исходящего с сервера.

Самый простой способ исправить это - запретить привязку nginx или nsd к определенному IP-адресу, а прослушивание любого адреса. Например, в nginx:

listen [::]:80;

Менее простое решение - исправить ваш скрипт сетевых интерфейсов. Как вы настроили сейчас, ваши IP-адреса направляются к вам, но на самом деле они не привязаны к интерфейсу таким образом, чтобы программы могли их явно прослушивать. (Они получают трафик только в том случае, если они привязаны к какому-либо адресу, как указано выше). Для этого вам потребуются дополнительные iface разделы вместо ip route команды.

iface eth0 inet6 static
        address 2001:db8::1234
        netmask 64

iface eth0 inet6 static
        address 2001:db8::5678
        netmask 64

iface eth0 inet6 static
        address 2001:db8::abcd
        netmask 64

Похоже, что nsd3 должен запускаться после сети. добавление $ network в часть Required-Start файла /etc/init.d/nsd3 должно решить проблему.