70人参与 • 2026-05-07 • Linux
在实际的生产环境中,我们通常不希望将 redis 等中间件服务直接暴露在公网中。通过 nginx 代理 redis,可以实现安全访问、负载均衡以及高可用性。
本教程将详细介绍如何使用 nginx 的 stream 模块代理 redis 的 tcp 连接,以及如何配置 nginx 缓存来配合 redis。
nginx 代理 redis 主要依赖 stream 模块(用于 tcp/udp 代理)。大多数现代 nginx 版本(1.9.0+)默认包含此模块,但我们需要确认。
检查 nginx 版本及编译参数:
在终端执行以下命令:
nginx -v
查看输出结果:
寻找 --with-stream 字样。
注意:如果你使用的是包管理器(如 yum 或 apt)安装的 nginx,通常 stream 模块是默认开启的。
这是最常用的场景,用于隐藏真实的 redis 服务器地址,或者为 redis 集群提供统一的入口。
打开主配置文件,通常位于 /etc/nginx/nginx.conf。
在配置文件的顶层(与 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;
}
}syntax is ok 和 test is successful,则继续。使用 redis-cli 连接 nginx 的 ip,看是否能成功操作 redis:
redis-cli -h <nginx服务器ip> -p 6379
除了 tcp 代理,nginx 还可以作为 http 反向代理,将动态请求的响应缓存在本地,或者利用 redis 作为存储后端(需第三方模块)。这里介绍标准的 nginx 本地文件缓存 模式,这通常用于减轻 redis 或后端应用的压力。
在 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;
}
}
}确保 nginx 有权限写入缓存目录:
mkdir -p /var/cache/nginx chown nginx:nginx /var/cache/nginx # 根据实际运行用户调整
在使用 nginx 代理 redis 时,请务必注意以下几点:
firewalld 或 iptables)中,仅开放 nginx 的代理端口(如 6379),并严格限制访问来源 ip。stream 模块中,合理设置 proxy_timeout。redis 的长连接如果被 nginx 过早切断,会导致客户端报错。通常建议设置较长的超时时间或保持默认。http 块中使用 proxy_pass 直接代理 redis 的 tcp 端口。redis 使用的是自定义的 tcp 协议(resp),不是 http 协议,必须使用 stream 模块进行四层代理。通过以上配置,你可以构建一个安全、稳定且具备一定缓存能力的 nginx + redis 架构。
到此这篇关于linux 中 nginx 代理 redis 的详细步骤的文章就介绍到这了,更多相关nginx 代理 redis 内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论