服务器是运行 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