在实际的生产环境中,我们通常不希望将 redis 等中间件服务直接暴露在公网中。通过 nginx 代理 redis,可以实现安全访问、负载均衡以及高可用性。
本教程将详细介绍如何使用 nginx 的 stream 模块代理 redis 的 tcp 连接,以及如何配置 nginx 缓存来配合 redis。
️ 1. 环境准备与模块检查
nginx 代理 redis 主要依赖 stream 模块(用于 tcp/udp 代理)。大多数现代 nginx 版本(1.9.0+)默认包含此模块,但我们需要确认。
检查 nginx 版本及编译参数:
在终端执行以下命令:
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:单机代理(基础转发)
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 主从架构或多个分片,可以配置多个后端。
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:
redis-cli -h <nginx服务器ip> -p 6379
3. 进阶配置:nginx http 缓存配合 redis
除了 tcp 代理,nginx 还可以作为 http 反向代理,将动态请求的响应缓存在本地,或者利用 redis 作为存储后端(需第三方模块)。这里介绍标准的 nginx 本地文件缓存 模式,这通常用于减轻 redis 或后端应用的压力。
3.1 定义缓存路径
在 http 块中定义缓存空间:
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 有权限写入缓存目录:
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 架构。
到此这篇关于linux 中 nginx 代理 redis 的详细步骤的文章就介绍到这了,更多相关nginx 代理 redis 内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论