Linux 中 Nginx 代理 Redis 的详细教程

在实际的生产环境中,我们通常不希望将 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 并添加该模块。

注意 :如果你使用的是包管理器(如 yumapt)安装的 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 测试并重启
  1. 测试配置语法:
  2. 如果显示 syntax is oktest is successful,则继续。
  3. 重载配置:
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 时,请务必注意以下几点:

  1. 防火墙配置
    • 虽然 Nginx 代理了 Redis,但建议在防火墙(如 firewalldiptables)中,仅开放 Nginx 的代理端口(如 6379),并严格限制访问来源 IP。
    • 真实 Redis 服务器的 6379 端口 应该只对 Nginx 服务器的内网 IP 开放,不要对公网开放。
  2. SSL/TLS 加密
    • 如果通过公网传输 Redis 数据,建议在 Nginx 层配置 SSL 证书,或者在 Redis 内部开启 TLS 支持,防止密码和数据被嗅探。
  3. 超时设置
    • stream 模块中,合理设置 proxy_timeout。Redis 的长连接如果被 Nginx 过早切断,会导致客户端报错。通常建议设置较长的超时时间或保持默认。
  4. 避免 HTTP 协议混淆
    • 不要试图在 http 块中使用 proxy_pass 直接代理 Redis 的 TCP 端口。Redis 使用的是自定义的 TCP 协议(RESP),不是 HTTP 协议,必须使用 stream 模块进行四层代理。

通过以上配置,你可以构建一个安全、稳定且具备一定缓存能力的 Nginx + Redis 架构。

相关推荐
GetcharZp1 小时前
告别 Nginx 手动配置!这款 Go 语言开发的云原生网关,才是容器化时代的真香神器!
后端
RuoyiOffice2 小时前
SpringBoot+Vue3 企业考勤如何处理法定假期?节假日方案、调休补班与工作日判断链路拆解
spring boot·后端·vue·anti-design-vue·ruoyioffice·假期·人力
Vane12 小时前
从零开发一个AI插件,经历了什么?
人工智能·后端
952362 小时前
SpringBoot统一功能处理
java·spring boot·后端
MiNG MENS2 小时前
nginx 代理 redis
运维·redis·nginx
rleS IONS3 小时前
SpringBoot中自定义Starter
java·spring boot·后端
DevilSeagull3 小时前
MySQL(2) 客户端工具和建库
开发语言·数据库·后端·mysql·服务
TeDi TIVE4 小时前
springboot和springframework版本依赖关系
java·spring boot·后端
雨辰AI4 小时前
SpringBoot3 + 人大金仓 V9 微服务监控实战|Prometheus+Grafana+SkyWalking 全链路监控
数据库·后端·微服务·grafana·prometheus·skywalking