在实际的生产环境中,我们通常不希望将 Redis 等中间件服务直接暴露在公网中。通过 Nginx 代理 Redis,可以实现安全访问、负载均衡以及高可用性。
本教程将详细介绍如何使用 Nginx 的 stream 模块代理 Redis 的 TCP 连接,以及如何配置 Nginx 缓存来配合 Redis。
️ 1. 环境准备与模块检查
Nginx 代理 Redis 主要依赖 stream 模块(用于 TCP/UDP 代理)。大多数现代 Nginx 版本(1.9.0+)默认包含此模块,但我们需要确认。
检查 Nginx 版本及编译参数:
在终端执行以下命令:
bash
nginx -V
查看输出结果:
寻找 --with-stream 字样。
- 如果有:直接进行下一步。
- 如果没有:你需要重新编译 Nginx 并添加该模块。
注意 :如果你使用的是包管理器(如 yum 或 apt)安装的 Nginx,通常 stream 模块是默认开启的。
️ 2. 核心配置:使用 Stream 模块代理 TCP 连接
这是最常用的场景,用于隐藏真实的 Redis 服务器地址,或者为 Redis 集群提供统一的入口。
2.1 编辑 Nginx 配置文件
打开主配置文件,通常位于 /etc/nginx/nginx.conf。
2.2 添加 Stream 配置块
在配置文件的顶层(与 http 块同级),添加 stream 块。
场景 A:单机代理(基础转发)
nginx
stream {
# 定义 Redis 后端服务器组
upstream redis_backend {
server 127.0.0.1:6379; # 真实的 Redis 地址
}
# 配置代理服务器
server {
listen 6379; # Nginx 监听的端口
proxy_pass redis_backend; # 转发到后端
proxy_timeout 3s; # 连接超时
proxy_connect_timeout 1s;
}
}
场景 B:高可用与负载均衡(推荐)
如果你有 Redis 主从架构或多个分片,可以配置多个后端。
nginx
stream {
upstream redis_backend {
# 简单的轮询负载均衡
server 192.168.1.46:6379;
server 192.168.1.47:6379;
# 或者使用权重(性能好的机器权重高)
# server 192.168.1.46:6379 weight=3;
# server 192.168.1.47:6379 weight=1;
}
server {
listen 6379;
proxy_pass redis_backend;
# 健康检查(Nginx Plus 功能,开源版支持有限,通常依赖被动检查)
# health_check interval=5s;
}
}
2.3 测试并重启
- 测试配置语法:
- 如果显示
syntax is ok和test is successful,则继续。 - 重载配置:
2.4 验证代理
使用 redis-cli 连接 Nginx 的 IP,看是否能成功操作 Redis:
bash
redis-cli -h <Nginx服务器IP> -p 6379
3. 进阶配置:Nginx HTTP 缓存配合 Redis
除了 TCP 代理,Nginx 还可以作为 HTTP 反向代理,将动态请求的响应缓存在本地,或者利用 Redis 作为存储后端(需第三方模块)。这里介绍标准的 Nginx 本地文件缓存 模式,这通常用于减轻 Redis 或后端应用的压力。
3.1 定义缓存路径
在 http 块中定义缓存空间:
nginx
http {
# 定义缓存路径、内存区域大小(keys_zone)、最大磁盘空间(max_size)
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;
server_name example.com;
location / {
# 启用缓存
proxy_cache my_cache;
# 缓存键:根据URL、请求方法等生成唯一标识
proxy_cache_key "$scheme$request_method$host$request_uri";
# 缓存有效期:200状态码缓存1小时,其他缓存5分钟
proxy_cache_valid 200 1h;
proxy_cache_valid any 5m;
# 后端地址(这里可以是你的应用服务器,应用服务器再去读Redis)
proxy_pass http://127.0.0.1:8080;
# 添加缓存状态头,方便调试
add_header X-Cache-Status $upstream_cache_status;
}
}
}
3.2 创建缓存目录
确保 Nginx 有权限写入缓存目录:
bash
mkdir -p /var/cache/nginx
chown nginx:nginx /var/cache/nginx # 根据实际运行用户调整
️ 4. 安全与优化建议
在使用 Nginx 代理 Redis 时,请务必注意以下几点:
- 防火墙配置 :
- 虽然 Nginx 代理了 Redis,但建议在防火墙(如
firewalld或iptables)中,仅开放 Nginx 的代理端口(如 6379),并严格限制访问来源 IP。 - 真实 Redis 服务器的 6379 端口 应该只对 Nginx 服务器的内网 IP 开放,不要对公网开放。
- 虽然 Nginx 代理了 Redis,但建议在防火墙(如
- SSL/TLS 加密 :
- 如果通过公网传输 Redis 数据,建议在 Nginx 层配置 SSL 证书,或者在 Redis 内部开启 TLS 支持,防止密码和数据被嗅探。
- 超时设置 :
- 在
stream模块中,合理设置proxy_timeout。Redis 的长连接如果被 Nginx 过早切断,会导致客户端报错。通常建议设置较长的超时时间或保持默认。
- 在
- 避免 HTTP 协议混淆 :
- 不要试图在
http块中使用proxy_pass直接代理 Redis 的 TCP 端口。Redis 使用的是自定义的 TCP 协议(RESP),不是 HTTP 协议,必须使用stream模块进行四层代理。
- 不要试图在
通过以上配置,你可以构建一个安全、稳定且具备一定缓存能力的 Nginx + Redis 架构。