Apache 绑定地址与端口

配置 Apache HTTP Server 侦听特定的地址和端口。

相关模块 :corempm_common

相关指令 :<VirtualHost>Listen

httpd 启动时,它会绑定到本地主机上的一些端口和地址,然后等待传入请求。它默认会侦听本地的所有地址。然而,实际上只需要侦听某些端口、某些地址。绑定通常会与虚拟主机功能合并在一起,共同决定 httpd 如何面对不同的 IP 地址、主机名、端口。

Listen 指令

Listen 指令会告诉服务端只接受特定 端口地址-端口 组合传入的请求。

如果 Listen 只指定了一个端口号,服务端则在所有网络接口上侦听这个端口。

如果指定了一个地址、一个端口号,服务端只在该接口上侦听该端口。

如果指定多个地址和端口,服务端会在这些地址上侦听指定的端口。

范例

Listen 80
Listen 8000

服务端会接受所有接口上来自 80 和 8000 两个端口的连接。

Listen 192.0.2.1:80
Listen 192.0.2.5:8000

服务端会接受一个接口上的 80 端口的连接,以及另一个接口上的 8000 端口的连接。

IPv6 地址必须用方括号括起来:

Listen [2001:db8::a00:20ff:fea7:ccea]:80

如果 Listen 指令设定的地址、端口发生叠加会导致严重错误,服务端会无法启动。

(48)Address already in use: make_sock: could not bind to address [::]:80

修改侦听配置对重启的影响

修改了 Listen 指令之后,如果新配置与原配置是冲突的,要想让新配置生效,必须先停止服务,然后再启动。

因为在重启期间,httpd 会始终保持原配置的绑定,以避免对新的传入连接产生 “连接被拒绝” 错误。如果新旧配置有冲突,服务端就会被终止。

IPv6 配置

越来越多的平台开始部署 IPv6,在这些平台上,APR 也开始支持 IPv6,允许 httpd 使用 IPv6 套接字来处理请求。

对于管理员来说,一个复杂的因素是,IPv6 的套接字是否既能处理 IPv4 的连接,又能处理 IPv6 的连接。用 IPv6 的套接字来处理 IPv4 的连接,这些 IPv6 套接字使用的是 IPv4 映射的 IPv6 地址,在多数平台都默认允许使用的,除了 FreeBSD、NetBSD、OpenBSD,是为了匹配其系统范围内的策略。

另一方面,在一些平台上,如 Linux,要想同时处理 IPv6 和 IPv4,唯一的办法就是使用映射地址。要想让 httpd 用最少数量的套接字来处理 IPv4 和 IPv6 的连接,需要指定 --enable-v4-mapped 配置选项。

如果希望 httpd 只处理 IPv4 的连接,只需在所有 Listen 指令中指定一个 IPv4 地址即可:

Listen 0.0.0.0:80
Listen 192.0.2.1:80

如果希望用不同的套接字来分别处理 IPv4 和 IPv6 的连接,可以指定 --disable-v4-mapped 配置选项。

设定侦听协议

协议参数在 Listen 是可选的,通常是不需要的。在没有指定的情况下,端口 443 的默认协议为 https,所有其它端口默认协议为 http。协议参数是用来决定使用哪个模块来处理请求的,并使用 AcceptFilter 指令来进行特定协议的优化。

只有在使用非标准端口时才需要指定协议,如在端口 8443 上运行 https 协议:

Listen 192.170.2.1:8443 https

地址绑定与虚拟主机的关系

Listen 指令不会部署虚拟主机,它只告诉主服务端去侦听什么地址和端口。如果没有使用 <VirtualHost> 指令,服务端对所有接受的请求以相同的方式对待。然而,可以用 <VirtualHost> 来为一个或多个地址或端口指定不同的行为。

要想部署一个虚拟主机,服务端首先必须被告知要侦听哪个地址和端口,然后为该地址和端口创建一个 <VirtualHost> 区块,来设定该虚拟主机的行为。如果设定的地址和端口是服务端没有在侦听的,它就无法被访问。