Nginx stream模块专用于TCP/UDP四层转发,不解析HTTP等应用层协议,适用于MySQL、SSH等非HTTP服务;需编译时启用--with-stream,配置置于顶层stream块,支持负载均衡、被动健康检查及连接优化。

Nginx 的 stream 模块专用于处理 TCP/UDP 流量,不解析应用层协议(如 HTTP),直接在传输层做转发,适合数据库、SSH、Redis、SMTP 等非 HTTP 服务的反向代理与负载均衡。
启用 stream 模块并配置基础结构
确保编译 Nginx 时已开启 --with-stream(官方预编译包通常默认包含)。配置需独立于 http 块,放在顶层作用域:
# /etc/nginx/nginx.conf
stream {
include /etc/nginx/stream.d/*.conf;
}
<p>events {
worker_connections 1024;
}</p>推荐将具体代理规则拆分到 stream.d/ 目录下,便于维护。注意:stream 块中不能使用 http 指令,也不支持 rewrite、access_log(原生)等 HTTP 特性。
配置 TCP 反向代理(以 MySQL 为例)
以下配置将本地 3307 端口流量转发至后端 MySQL 实例(192.168.1.100:3306):
# /etc/nginx/stream.d/mysql.conf
upstream mysql_backend {
server 192.168.1.100:3306 max_fails=3 fail_timeout=30s;
# 可添加多个 server 实现简单负载均衡
}
<p>server {
listen 3307;
proxy_pass mysql_backend;
proxy_timeout 1h;
proxy_responses 1; # 对无响应协议(如 MySQL handshake)可设为 0 或省略
}</p>-
proxy_timeout控制连接空闲超时,默认 60s,数据库类长连接建议调大 -
proxy_responses用于校验后端是否返回预期响应包数;MySQL 初始握手仅 1 包,设为 1 更稳妥 - 不支持 TLS 终止(即不能像 HTTP 那样做 SSL 卸载),如需加密需用
ssl_preread模块配合或由后端处理
健康检查与连接控制
stream 模块原生支持被动健康检查(基于失败次数),主动检查需借助第三方模块(如 nginx-plus 或开源 nginx-stream-upsync-module)。常用控制项包括:
-
max_fails和fail_timeout:连续失败多少次后摘除节点多长时间 -
proxy_buffer_size:设置代理缓冲区大小,默认 8k,高吞吐场景可适当调大 -
proxy_bind:指定出口网卡或 IP,适用于多网卡服务器 -
tcp_nodelay on;:禁用 Nagle 算法,降低小包延迟(对交互式协议如 SSH 有效)
验证与调试技巧
配置完成后执行 nginx -t 检查语法,再 nginx -s reload 生效。调试建议:
- 用
telnet 127.0.0.1 3307或mysql -h127.0.0.1 -P3307 -u... -p直连测试通断 - 查看错误日志:
tail -f /var/log/nginx/error.log,常见报错如 “no live upstreams” 表示后端不可达 - 启用连接日志需自定义
log_format并在server块中用access_log,例如:
log_format basic '$remote_addr $protocol $status $bytes_sent $bytes_received $session_time'; access_log /var/log/nginx/stream-access.log basic;










