Nginx Stream模块的listen指令用于TCP/UDP监听,仅在stream上下文中有效,支持udp、ssl、so_keepalive、backlog等参数优化连接性能,但不支持http2等HTTP专属参数。

Stream_core_module 的 listen 指令本身并不存在于标准 Nginx 模块中——Nginx 官方 stream 模块(ngx_stream_core_module)使用的是 listen 指令,但它是 stream 上下文中的核心指令,用于配置 TCP/UDP 流量的端口监听行为。所谓“优化端口监听”,实际是指合理配置 listen 的参数,以提升高并发、低延迟场景下的连接处理能力与资源利用率。
明确 listen 所在上下文和基础语法
listen 只能出现在 stream { ... } 块内,不能用于 http 或 server(http 级)上下文。基本写法为:
-
listen 12345;—— 监听所有 IPv4 地址的 12345 端口 -
listen 192.168.1.10:8443 ssl;—— 绑定指定 IP,启用 TLS(stream 模块支持 TLS 透传) -
listen [::1]:53 udp;—— IPv6 + UDP 协议监听
注意:stream 模块默认仅处理 TCP;如需 UDP,必须显式添加 udp 参数,且不能与 ssl 共存。
用 socket 选项减少延迟和提升吞吐
通过 so_keepalive、backlog、rcvbuf/sndbuf 等参数可直接影响内核 socket 行为:
-
so_keepalive=on:启用 TCP keepalive,及时发现僵死连接,避免连接堆积 -
backlog=4096:增大全连接队列长度,缓解突发连接请求被丢弃(需同时调大系统net.core.somaxconn) -
rcvbuf=256k sndbuf=256k:预设接收/发送缓冲区大小,降低小包频繁拷贝开销,适合高频低延迟代理(如 Redis、MySQL 转发)
示例:listen 6379 so_keepalive=on backlog=8192 rcvbuf=512k sndbuf=512k;
按协议和地址精细化监听,避免端口争用
不推荐所有服务共用一个 listen 行来“复用端口”(stream 模块不支持 ALPN 或 SNI 分流,无法像 HTTP 那样多域名复用)。应按实际用途拆分:
- 对外提供 MySQL 服务:绑定公网 IP +
so_keepalive+ 较大backlog - 内部健康检查端口:绑定
127.0.0.1,禁用so_keepalive,减小开销 - UDP DNS 转发:单独
listen 53 udp;,避免与 TCP 端口混用影响调度
错误做法:listen *:8000 ssl http2; —— stream 模块不识别 http2,该参数会被忽略甚至导致配置加载失败。
配合 upstream 和 proxy_timeout 实现稳定监听
listen 本身只管接入,真正影响稳定性的是后端转发链路。建议配套设置:
- 在
upstream中启用least_conn或hash $remote_addr consistent;,避免单点过载 - 设置
proxy_timeout 30s;和proxy_responses 1;(对请求-响应型协议如 Redis)防止长连接挂起 - 启用
proxy_bind $remote_addr transparent;(需 root 权限)保留原始客户端 IP,便于后端做连接限速
监听只是入口,没有合理的超时与重试策略,再优的 listen 配置也无法保障服务 SLA。











