Nginx需启用stream模块实现MySQL/Redis四层负载均衡,配置必须置于顶层stream块中、不可嵌套于http块;MySQL代理须设proxy_responses 1和较长proxy_timeout,Redis代理推荐hash $remote_addr consistent保证连接一致性,真实客户端IP仅能通过PROXY协议透传。

MySQL 和 Redis 默认使用 TCP 协议通信(非 HTTP),因此不能用 Nginx 的 http 模块做七层负载均衡,而需启用其 stream 模块实现四层(TCP/UDP)代理与负载均衡。
确认 Nginx 已编译并启用 stream 模块
Nginx 1.9.0+ 内置 stream 模块,但默认不编译进二进制。需确认是否启用:
- 运行
nginx -V 2>&1 | grep -o with-stream,若输出with-stream,说明已启用; - 若无输出,需重新编译 Nginx 并添加
--with-stream参数; - Debian/Ubuntu 用户可安装
nginx-full(含 stream 支持),CentOS/RHEL 可用 EPEL 中的 nginx 或使用官方源。
配置 MySQL 四层负载均衡(TCP 代理)
在 /etc/nginx/nginx.conf 的顶层(不在 http{} 块内)添加 stream{} 块:
stream {
upstream mysql_backend {
least_conn;
server 192.168.1.10:3306 max_fails=3 fail_timeout=30s;
server 192.168.1.11:3306 max_fails=3 fail_timeout=30s;
# 可加 backup 或 weight(仅在支持的版本中生效)
}
<pre class="brush:php;toolbar:false;">server {
listen 3306;
proxy_pass mysql_backend;
proxy_timeout 1h;
proxy_responses 1;
proxy_buffer_size 256k;
# 可选:开启连接日志(需配合 error_log)
access_log /var/log/nginx/mysql_access.log;
error_log /var/log/nginx/mysql_error.log;
}}
注意:
– MySQL 客户端直连 Nginx 监听的 3306 端口,Nginx 将 TCP 流透明转发至后端;
– least_conn 是推荐的负载策略(比轮询更适合长连接场景);
– proxy_timeout 应设为大于 MySQL 的 wait_timeout(避免被中间断连);
– 不支持健康检查(如 HTTP probe),可用 tcp_check 配合第三方模块(如 nginx_upstream_check_module),或依赖 max_fails/fail_timeout 被动探测。
配置 Redis 四层负载均衡(TCP 代理)
同理,在同一 stream{} 块中追加 Redis 配置:
upstream redis_backend {
least_conn;
server 192.168.1.20:6379 max_fails=3 fail_timeout=30s;
server 192.168.1.21:6379 max_fails=3 fail_timeout=30s;
}
<p>server {
listen 6379;
proxy_pass redis_backend;
proxy_timeout 1h;
proxy_responses 1;
proxy_buffer_size 256k;</p><h1>若用 Redis Sentinel 或 Cluster,注意:Nginx stream 不解析 RESP 协议,仅做透传</h1><p>}关键提醒:
– Redis 客户端连接 Nginx 的 6379 端口即可,无需修改业务代码;
– proxy_responses 1 表示等待至少 1 个响应字节再判定连接建立成功(提升可靠性);
– 若后端是 Redis Cluster,Nginx 无法做 key 路由,仅适合单节点主从或读写分离架构(需客户端自行处理分片);
– 不建议对 Redis 启用 keepalive 连接池(stream 层无连接复用机制),每个客户端连接对应一个后端连接。
安全与生产注意事项
四层代理不校验应用层协议,所以必须加固网络层:
- 限制访问来源:用
allow/deny指令(需在server{}内)或防火墙(如 iptables/nftables)只放行可信 IP; - 禁用默认监听:确保 Nginx 不监听公网 0.0.0.0:3306/6379,只绑定内网 VIP 或特定网卡;
- 避免明文暴露:MySQL/Redis 认证凭据仍由后端负责,Nginx 不参与鉴权;务必启用 SSL/TLS(MySQL 的
require_secure_transport、Redis 的tls-port),并在客户端强制使用加密连接; - 监控连接数:通过
nginx_stub_status(stream 模块对应stub_status需启用ngx_stream_upstream_module)或系统级指标(ss -s,netstat)观察并发连接压力。


















