Nginx 和 NSD3 无法在启动时启动,因为它们无法使用分配的 IP

Nginx 和 NSD3 无法在启动时启动,因为它们无法使用分配的 IP

服务器是运行 Ubuntu 12.04 的 Xen VPS,重启后 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

那些尴尬的 up id addr 之所以存在是因为我想添加额外的 IP,但对于来自服务器的所有流量仍然使用第一个 IP。

答案1

看起来 nsd3 必须在网络之后启动。在 /etc/init.d/nsd3 文件的Required-Start 部分添加 $network 应该可以解决问题。

答案2

最简单的解决方法是不让 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

相关内容