Nginx中listen指令用于定义server块监听的IP和端口,支持多地址绑定、SSL/HTTP2启用及socket行为调优;匹配优先级为具体IP>通配符,default_server可显式指定默认块。

在 Nginx 中,server 块通过 listen 指令定义虚拟主机监听的端口和 IP 地址,这是实现多站点共存、端口复用或绑定特定网卡的关键配置。
listen 指令的基本语法与常见写法
listen 指令支持多种组合形式,核心格式为:listen [address[:port]] [default_server] [ssl] [http2] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred] [bind] [ipv6only=on|off] [so_keepalive=on|off|keepidle:keepintvl:keepcnt];
常用简写示例如下:
-
listen 80;— 监听本机所有 IPv4 和 IPv6 地址的 80 端口(等价于listen *:80) -
listen 192.168.1.10:80;— 仅监听指定 IPv4 地址的 80 端口 -
listen [::]:80;— 仅监听所有 IPv6 地址的 80 端口 -
listen 443 ssl http2;— 启用 HTTPS 和 HTTP/2(需配合ssl_certificate等指令)
同一端口绑定多个地址或区分优先级
当多个 server 块监听相同端口时,Nginx 按匹配精度决定路由顺序:更具体的 listen(如带 IP)优先于通配符(如 *:80);若都带 IP,则按配置顺序(首个匹配生效)。
例如:
server { listen 10.0.0.1:80; server_name site-a.local; ... }server { listen 10.0.0.2:80; server_name site-b.local; ... }-
server { listen *:80; server_name _; ... }— 默认兜底,处理未匹配到的请求
注意:default_server 参数可显式标记默认块(如 listen 80 default_server;),比靠顺序更可靠。
端口复用与特殊场景配置
某些场景需精细控制 socket 行为:
-
bind:强制为每个listen单独调用bind(),适用于同一端口绑定不同 IP 且需独立选项(如不同rcvbuf) -
so_keepalive=on:启用 TCP keepalive,适合长连接服务 -
ipv6only=on:避免 IPv6 socket 同时接受 IPv4 映射连接(Linux 默认 off,建议显式设为 on 避免歧义) - 非标准端口如
listen 8080;或listen 127.0.0.1:8000;常用于反向代理上游或开发调试
验证与排错要点
配置完成后务必检查并测试:
- 运行
nginx -t验证语法正确性 - 用
ss -tlnp | grep :80或netstat -tlnp | grep nginx查看实际监听状态 - 注意防火墙(如
ufw或iptables)是否放行对应端口 - 若请求被错误 server 块响应,检查
server_name匹配逻辑及listen的 IP 精确度










