nginx stream模块可代理redis集群实现统一入口、连接管控与故障隔离,但不解析moved/ask响应,无法替代客户端重定向逻辑;需显式编译启用,配置在http块外,配合健康检查与ip限制提升可用性。

用 Nginx 的 stream 模块代理 Redis 集群,核心目标不是替代客户端重定向逻辑,而是提供统一入口、连接管控和基础故障隔离。它不解析 Redis 协议(比如 MOVED 或 ASK),所以不能自动处理集群重定向,但能有效隐藏后端拓扑、限制连接来源、控制超时,并在节点断连时快速切走流量。
确认并启用 stream 模块
Nginx 默认不编译 stream 模块,必须显式开启:
- 执行
nginx -V 2>&1 | grep with-stream,输出含with-stream表示已支持 - 若无输出,需重新编译:添加
--with-stream(推荐同时加--with-stream_ssl_module以备 TLS 场景) - 注意:stream 配置必须放在
http块之外的顶层,否则会报错
基础代理配置(单点或哨兵主节点)
适用于 Redis 单实例、主从结构,或哨兵集群中固定指向当前主节点的场景(需配合外部脚本更新 upstream):
- 在
nginx.conf顶部(http外)添加stream { ... }块 - 定义 upstream,例如:
upstream redis_backend { server 192.168.1.10:6379 max_fails=3 fail_timeout=10s; server 192.168.1.11:6379 max_fails=3 fail_timeout=10s; } - 配置监听与转发:
server { listen 6380; proxy_pass redis_backend; proxy_timeout 600s; proxy_connect_timeout 5s; }
接入集群需明确客户端责任
Redis Cluster 是去中心化架构,每个节点只负责部分 slot,客户端必须能识别 MOVED/ASK 并重连对应节点。Nginx stream 无法感知这些响应,因此:
- 不建议将 stream 直接前置在标准 Redis Cluster 前作为“统一入口”
- 若仍需集中代理,应让客户端具备集群模式支持(如 JedisCluster、redis-py-cluster),Nginx 仅做连接层负载和健康兜底
- 可搭配 TCP 层健康检查(
health_check)提升可用性,但仅检测端口通断,无法判断 OOM、只读状态等深层问题
简单访问隔离的关键配置项
利用 stream 的原生能力实现轻量级访问控制:
- 限制来源 IP:
allow 10.0.1.0/24; deny all;放在server块内 - 设置连接超时:
proxy_timeout防止长空闲连接堆积;proxy_responses 1可让 Nginx 在收到首个响应包后关闭连接(适合短请求) - 启用日志(需自定义 log_format):
access_log /var/log/nginx/redis_access.log;,便于审计连接行为 - 避免暴露真实后端地址:所有客户端只连 Nginx 的代理端口(如 6380),后端 IP 完全隐藏











