nginx监听地址匹配按ip精度优先级而非配置顺序:ip+端口>单ip>通配符;default_server作用于监听组合而非域名;ipv6须加方括号,ssl与非ssl不可共端口。

填对 listen 地址,关键不是“怎么写”,而是“写给谁听”——Nginx 会按精度逐级匹配请求的目标 IP 和端口,而不是照着配置顺序读。写宽了容易误收流量,写窄了可能漏掉合法请求。
监听地址的常见写法及适用场景
实际配置中,以下几种形式最常用,每种对应不同部署需求:
-
listen 80;:等价于
listen *:80;,监听所有 IPv4 地址的 80 端口(IPv6 默认不启用,除非显式加ipv6only=on) - listen 192.168.1.10:80;:只响应发往该 IP 的 HTTP 请求,适合多网卡或隔离内网服务
- listen [::]:80;:仅监听 IPv6 所有地址的 80 端口(注意中括号不能省)
-
listen 0.0.0.0:80;:明确限定 IPv4,和
*:80效果一致,语义更清晰 - listen unix:/var/run/nginx.sock;:用 Unix 域套接字通信,常用于与本地上游(如 PHP-FPM)高效交互
多个 listen 共存时的优先级规则
Nginx 不看配置先后,而按“地址精度”排序筛选候选 server 块:
- IP + 端口(如
10.0.0.5:80)> 单 IP(如10.0.0.5)> 通配符 IP(如*:80或80) - 同一端口下,
127.0.0.1:443比*:443优先;[::1]:443和127.0.0.1:443互不干扰,各自独立匹配 - 带
ssl参数的 listen(如listen 443 ssl;)和不带的属于不同协议组,不会互相竞争
default_server 的正确用法
它不是“兜底域名”,而是“兜底监听组合”:
-
listen 80 default_server;表示:所有命中 80 端口但未被更具体 listen 覆盖的请求,都交由这个块处理 - 没加
default_server,Nginx 就取该端口下第一个定义的 server 块——这容易因配置重排导致行为变化 - 建议每个常用端口单独设一个最小化默认块,比如返回 444(关闭连接)或 404,避免暴露内部信息
容易踩坑的细节
几个看似微小、实则影响匹配结果的关键点:
- IPv6 需用方括号:
[2001:db8::1]:80,写成2001:db8::1:80会被当成 IPv4 解析失败 -
listen *:80 ipv6only=on;和listen [::]:80;功能相同,但前者会禁用 IPv4 映射,后者只启 IPv6 - 混用
ssl和非ssl监听同一端口(如同时存在listen 443;和listen 443 ssl;)会导致 Nginx 启动失败 -
listen 127.0.0.1;表示监听该 IP 的所有端口,不是只监听 80——这种写法极少使用,需格外谨慎











