几天前,我configuration了lighttpd来监听我的VPS IPv6地址。 它运行在具有3.15.4-x86_64-linode45内核的Debian 7 Xen VPS(Linode)上。 lighttpd的版本是1.4.31-4+deb7u3 。
我的lighttpd.conf使用这个configuration来侦听IPv4:
server.bind = "10.0.0.1" server.port = 80
我添加了以下内容来启用IPv6: http://redmine.lighttpd.net/projects/lighttpd/wiki/IPv6-Config
$SERVER["socket"] == "[2001:DB8::1]:80" { }
现在,当我重新启动lighttpd时,一切都很顺利 – 最终,双方都按计划进行了听取。
问题出现后,我不得不重新启动我的VPS。 在启动时发现,启动lighttpd失败,并向控制台发送以下消息:
[....] Starting web server: lighttpd2014-10-20 21:00:19: (network.c.405) can't bind to port: 2001:DB8::1 80 Cannot assign requested address
如果我login并运行service lighttpd start它启动没有问题,听IPv4和IPv6。
我以为可能在启动的时候没有IPv6地址,所以在尝试启动之前(在初始化脚本中),我把它输出到了一个文件,并且它的两个IP都被分配给了这个接口。
任何想法可能是什么问题或如何进一步解决这个问题?
当configurationIPv6地址时,它们不能立即使用。 系统首先执行DAD(重复地址检测)以确保其新地址与另一个系统上的现有地址不冲突。 应用程序不能绑定(至less不是默认设置)到仍然是暂定的地址。
Debian ifupdown软件包的最新版本包含一个名为settle-dad.sh的脚本,它将暂停,直到界面离开暂定状态。 您可能希望在configurationnetworking接口和启动服务器之间将这样的脚本添加到启动过程中。
这不是那么大/复杂:
#!/bin/sh # 6 seconds maximum wait time attempts=${IF_DAD_ATTEMPTS:-60} delay=${IF_DAD_INTERVAL:-0.1} [ $attempts -eq 0 ] && exit 0 echo -n "Waiting for DAD... " for attempt in $(seq 1 $attempts); do tentative=$(ip -o -6 address list dev "$IFACE" to "${IF_ADDRESS}/${IF_NETMASK}" tentative | wc -l) if [ $tentative -eq 0 ]; then attempt=0 # This might have been our last attempt, but succesful break fi sleep $delay done if [ $attempt -eq $attempts ]; then echo "Timed out" exit 1 fi dadfailed=$(ip -o -6 address list dev "$IFACE" to "${IF_ADDRESS}/${IF_NETMASK}" dadfailed | wc -l) if [ $dadfailed -ge 1 ]; then echo "Failed" exit 1 fi echo Done
它是在GPLv2许可下分发的。