IPv6 配置¶
背景¶
默认情况下,如果未设置 server.bind
或 server.port
,lighttpd 会在 80 端口(“0.0.0.0:80”)监听 IPv4 通配符地址(INADDR_ANY)。要更改默认端口,请设置 server.port
总结:在单独的行中明确指定 IPv4 和 IPv6 地址(或通配符) (参见下面的“推荐的 IPv6 设置”)
对于 IPv6 通配符“::”(in6addr_any)和 IPv4 映射的 IPv6 地址(例如“::ffff:127.0.0.1”),有一个名为 IPV6_V6ONLY 的 IPPROTO_IPV6 内核套接字选项,它会使套接字仅绑定到 IPv6 地址,而不绑定到等效的 IPv4 地址。如果对于 AF_INET6 (IPv6) 地址族,此套接字选项不存在,那么套接字是否仅绑定到 IPv6 地址取决于内核的默认配置。换句话说,在某些系统上,无论 lighttpd 是否设置了 IPV6_V6ONLY,IPv6 套接字都将强制使用 IPV6_V6ONLY。这些系统包括现代 Debian Linux、FreeBSD、Mac OS X 以及其他可能的默认配置。在这些系统上,两条单独的套接字指令才能让 lighttpd 同时监听 IPv4 和 IPv6 地址,例如 0.0.0.0 和 [::]。 (参见下面的“推荐的 IPv6 设置”)
推荐的 IPv6 设置¶
(适用于 lighttpd 1.4.27 或更高版本,或 Linux 操作系统 sysctl net.ipv6.bindv6only = 1
,或其他等效操作系统)
在服务器上监听所有 TCP 地址
# listen to IPv4 server.bind = "0.0.0.0" server.port = "80" # listen to IPv6 $SERVER["socket"] == "[::]:80" { } # SSL/TLS $SERVER["socket"] == "0.0.0.0:443" { ssl.engine = "enable" } $SERVER["socket"] == "[::]:443" { ssl.engine = "enable" } # SSL/TLS options shared among $SERVER["socket"] with ssl.engine = "enable" #<shared ssl.* options>
仅针对通配符地址上的 HTTPS 并在 443 端口监听
server.bind = "0.0.0.0" # (default; implied) server.port = "443" $SERVER["socket"] == "0.0.0.0:443" { ssl.engine = "enable" } # (redundant with default) $SERVER["socket"] == "[::]:443" { ssl.engine = "enable" } # SSL/TLS options shared among $SERVER["socket"] with ssl.engine = "enable" #<shared ssl.* options> ssl.engine = "enable"
监听“真实”IPv6 地址¶
示例 (IPv6 本地主机 [::1])
server.bind = "[::1]"
$SERVER["socket"] == "[::1]:80" { ... }
这些配置没有问题 - 它们在任何情况下都只监听 IPv6。
监听未指定地址(通配符)¶
示例 (通配符地址)- 完全不设置
server.bind
,但在全局上下文中使用server.use-ipv6 = "enable"
$SERVER["socket"] == ":80" { server.use-ipv6 = "enable" ... }
这些配置监听 IPv6 的“任意”地址;根据您的系统,这可能也会接受 IPv4 连接(Linux 上的默认设置,除非您的发行版禁用了它;请检查 sysctl net.ipv6.bindv6only
)。
因此,如果内核默认设置发生变化,此类配置可能随时失效。
监听 [::]¶
如果您使用 1.4.27+ 版本或 Linux 系统 sysctl net.ipv6.bindv6only
= 1,则这将仅监听 IPv6。否则,它将同时监听 IPv6 和 IPv4。
server.bind = "[::]"
$SERVER["socket"] == "[::]:80" { ... }
1.4.27 版本中的变更¶
自 1.4.27 版本起,lighttpd 将为非空主机名的 IPv6 套接字设置“V6_ONLY”选项;也就是说,这两个仍然会像以前一样使用系统默认的 V6_ONLY 设置server.bind = ""
server.use-ipv6 = "enable"
$SERVER["socket"] == ":443" { server.use-ipv6 = "enable" }
但对于这些情况,自 1.4.27 版本起(或者如果 sysctl net.ipv6.bindv6only
为 1),lighttpd 将仅监听 IPv6。server.bind = "[::]"
server.bind = "localhost"
server.use-ipv6 = "enable"
$SERVER["socket"] "[::]:443" { }
$SERVER["socket"] "localhost:443" { server.use-ipv6 = "enable" }
如果您在相关代码块中设置 server.set-v6only = "disable"
,则可以恢复旧行为。不建议将此选项作为长期解决方案,因为我们可能会在几个版本后再次将其删除。