启用 ipv6 后 lighttpd 不会在启动时启动

启用 ipv6 后 lighttpd 不会在启动时启动

几天前,我配置了 lighttpd 来监听我的 VPS IPv6 地址。它运行在带有内核的 D​​ebian 7 Xen VPS (Linode) 上3.15.4-x86_64-linode45。lighttpd 的版本是1.4.31-4+deb7u3

我的 lighttpd.conf 使用这个配置来监听 IPv4:

server.bind                 = "10.0.0.1"
server.port                 = 80

我添加了以下内容以按照以下说明启用 IPv6http://redmine.lighttpd.net/projects/lighttpd/wiki/IPv6-Config

$SERVER["socket"] == "[2001:DB8::1]:80" {  }

现在,当我重新启动 lig​​httpd 时,一切都正常了 - 它最终按计划监听了两者。

问题出现在我不得不重启 VPS 之后。结果在启动时,启动 lig​​httpd 失败,控制台中显示以下消息:

[....] 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

如果我登录并运行,service lighttpd start它就会顺利启动,并同时监听 IPv4 和 IPv6。

我认为它可能在启动时没有 IPv6 地址,因此我ifconfig在尝试启动之前(在 init 脚本中)将其输出到文件中,并且它将两个 IP 分配给接口。

您知道可能是什么问题或者如何进一步排除故障吗?

答案1

配置 IPv6 地址后,它们不会立即可用。系统首先执行 DAD(重复地址检测)以确保其新地址不会与另一个系统上的现有地址冲突。应用程序无法绑定(至少在默认设置下)仍处于暂定状态的地址。

最新版本的Debian ifupdown 软件包包含一个名为的脚本settle-dad.sh,该脚本将暂停,直到接口离开暂定状态。您可能希望在配置网络接口和启动服务器之间将此类脚本添加到启动过程中。

它不是那么大/复杂:

#!/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 许可证

相关内容