You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NGINX代理Redis与PostgreSQL Docker容器的配置问题咨询

问题解答

核心结论

不能直接将proxy_pass改为redis://或postgresql://——Nginx的HTTP模块proxy_pass仅支持HTTP/HTTPS类协议,无法直接处理Redis、PostgreSQL的原生TCP协议流量。正确方案是使用Nginx的Stream模块实现TCP层代理,且不会影响现有HTTP服务。

具体实现步骤

  1. 确认Stream模块可用性
    大部分主流发行版的预编译Nginx包(如Ubuntu的nginx-full、CentOS官方源的nginx)已默认包含Stream模块。可通过nginx -V查看编译参数,确认包含--with-stream。

  2. 添加Stream代理配置
    在Nginx主配置文件(如/etc/nginx/nginx.conf)中,与现有http块同级添加stream块,独立配置TCP代理规则,完全不干扰现有HTTP服务:

    stream {
        # Redis TCP代理,监听本地63790端口(可自定义无冲突端口)
        server {
            listen 63790;
            proxy_pass xxx.xxx.xxx.xxx:6379; # 目标Redis容器的IP和端口
            proxy_timeout 30s;
            proxy_connect_timeout 1s;
        }
    
        # PostgreSQL TCP代理,监听本地54320端口
        server {
            listen 54320;
            proxy_pass xxx.xxx.xxx.xxx:5432; # 目标PostgreSQL容器的IP和端口
            proxy_timeout 300s;
            proxy_connect_timeout 2s;
        }
    }
    
  3. 调整Flask应用配置
    生产环境中,将Flask的数据库连接地址改为Nginx代理的端口:

    • Redis连接:redis://<nginx服务器IP>:63790
    • PostgreSQL连接:postgresql://postgres@<nginx服务器IP>:54320/table
  4. 验证与重启

    • 用nginx -t检查配置语法是否正确
    • 重启Nginx生效:systemctl restart nginx

注意事项

  • 端口选择需避开现有服务占用的端口,避免冲突
  • 确保Nginx服务器的防火墙开放代理端口(63790、54320),允许Flask应用所在服务器访问
  • 若Redis/PostgreSQL容器与Nginx在同一Docker网络,可直接使用容器名替代IP,减少配置复杂度

内容的提问来源于stack exchange,提问作者Richard McCormick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 01:57:43