NGINX代理Redis与PostgreSQL Docker容器的配置问题咨询
问题解答
核心结论
不能直接将proxy_pass改为redis://或postgresql://——Nginx的HTTP模块proxy_pass仅支持HTTP/HTTPS类协议,无法直接处理Redis、PostgreSQL的原生TCP协议流量。正确方案是使用Nginx的Stream模块实现TCP层代理,且不会影响现有HTTP服务。
具体实现步骤
确认Stream模块可用性
大部分主流发行版的预编译Nginx包(如Ubuntu的nginx-full、CentOS官方源的nginx)已默认包含Stream模块。可通过nginx -V查看编译参数,确认包含--with-stream。添加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; } }调整Flask应用配置
生产环境中,将Flask的数据库连接地址改为Nginx代理的端口:- Redis连接:
redis://<nginx服务器IP>:63790 - PostgreSQL连接:
postgresql://postgres@<nginx服务器IP>:54320/table
- Redis连接:
验证与重启
- 用
nginx -t检查配置语法是否正确 - 重启Nginx生效:
systemctl restart nginx
- 用
注意事项
- 端口选择需避开现有服务占用的端口,避免冲突
- 确保Nginx服务器的防火墙开放代理端口(63790、54320),允许Flask应用所在服务器访问
- 若Redis/PostgreSQL容器与Nginx在同一Docker网络,可直接使用容器名替代IP,减少配置复杂度
内容的提问来源于stack exchange,提问作者Richard McCormick
相关产品推荐
相关产品推荐

