Nginx stream模块仅提供TCP层转发,不解析MOVED/ASK响应,无法替代Redis客户端集群逻辑;适用于单节点、主从或哨兵架构,配置须置于http块外顶层,启用需确认with-stream编译参数。

Nginx 的 stream 模块不能替代 Redis 客户端的集群逻辑,它只做 TCP 层的原始流量转发,不解析 MOVED/ASK 重定向响应,也不处理哈希槽路由。它的作用是提供统一入口、连接管控和基础故障隔离,适合用在单节点、主从或哨兵架构中,而非标准 Redis Cluster 场景。
确认 stream 模块已启用
执行 nginx -V 2>&1 | grep with-stream。有输出说明已编译支持;若无,需重新编译并添加 --with-stream(推荐同时加 --with-stream_ssl_module)。注意:部分 yum/apt 安装的 Nginx 默认不含该模块,CentOS 可尝试安装 nginx-all-modules 包。
配置必须放在 http 块之外
stream 是顶层模块,配置不能嵌套在 http 内,否则会报 unknown directive "stream"。正确结构如下:
- 在
/etc/nginx/nginx.conf文件最外层(与 http 同级)添加stream { ... }块 - 内部定义
upstream和server,例如监听 6380 端口,转发到 127.0.0.1:6379 - 如需 TLS 透传,确保启用
stream_ssl_module并在 server 中配置 ssl 相关指令
代理 Redis 的典型配置方式
适用于单实例、主从或哨兵主节点(需配合外部脚本更新 upstream):
-
TCP 代理:直接转发到 Redis IP:Port,支持
ip_hash保证连接粘性,避免 pipeline 或事务被拆到不同节点 -
Unix Socket 代理:当 Nginx 与 Redis 同机时,用
proxy_pass unix:/path/to/redis.sock,减少网络开销,但需确保 Nginx 进程有 socket 文件读写权限 -
健康检查:启用
health_check可检测端口连通性,但无法识别 Redis OOM、只读状态等深层问题
Redis Cluster 场景下的注意事项
标准 Redis Cluster 是去中心化架构,客户端必须自行处理槽映射和重定向。Nginx stream 在此场景下仅能作为“前置网关”,不能替代客户端能力:
- 不要把 stream 当作集群统一入口直接暴露给不支持集群模式的客户端
- 建议搭配 JedisCluster、Lettuce、redis-py-cluster 等原生支持 Cluster 的客户端使用
- 可将 Nginx 用于连接限流、IP 白名单、超时控制(如
proxy_connect_timeout 5s),提升接入层安全性


















