Debian

啟用 ipv6 後 lighttpd 不會在啟動時啟動

  • October 20, 2014

幾天前,我還配置了 lighttpd 來監聽我的 VPS IPv6 地址。它在帶有3.15.4-x86_64-linode45核心的 Debian 7 Xen VPS (Linode) 上執行。lighttpd 的版本是1.4.31-4+deb7u3.

我的 lighttpd.conf 使用這個配置來監聽 IPv4:

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

我添加了以下內容以根據http://redmine.lighttpd.net/projects/lighttpd/wiki/IPv6-Config啟用 IPv6

$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

如果我登錄並執行service lighttpd start它,它會毫無問題地啟動,同時監聽 IPv4 和 IPv6。

我認為它可能在啟動時沒有 IPv6 地址,所以我ifconfig在嘗試啟動之前將其輸出到一個文件(在 init 腳本中),並且它的兩個 IP 都分配給了介面。

任何想法可能是什麼問題或如何進一步解決這個問題?

配置 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 許可下分發的。

引用自:https://serverfault.com/questions/638442