如何通过Nginx代理外部数据库客户端连接Ubuntu虚拟机上Docker部署的PgSQL数据库
PostgreSQL使用TCP协议通信,无法通过HTTP层代理,因此需要使用Nginx的stream模块实现四层TCP代理来满足需求。另外需要注意:TCP协议没有路径概念,你预期的123.4.5.6/db-backdoor:5432/db-name格式里的/db-backdoor路径无法生效,直接用IP+端口连接即可,具体配置如下:
1. 前置检查
确认你使用的Nginx镜像包含stream模块,官方Nginx Docker默认镜像已预装该模块,无需额外编译。同时确保Nginx容器和PostgreSQL容器加入了同一个Docker自定义网络,保证Nginx可以通过容器名/内部IP访问到PostgreSQL的5432端口。
2. 调整nginx.conf配置
stream块和http块是平级关系,不要写在http块内部,配置示例如下:
# 原有全局配置保持不变 user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; # 新增TCP代理配置块,和http块平级 stream { # 定义PostgreSQL上游地址,替换为你的PostgreSQL容器名或内部IP+端口 upstream pgsql_server { server 你的PG容器名:5432; } server { listen 5432; # 监听5432端口的TCP请求 proxy_pass pgsql_server; # 超时配置可按需调整 proxy_connect_timeout 10s; proxy_timeout 300s; } } http { # 你原有代理前后端的所有配置保持不变,无需修改 include /etc/nginx/mime.types; default_type application/octet-stream; # ... 其余原有配置省略 }
3. 调整Nginx容器启动配置
需要给Nginx容器新增5432端口的端口映射,如果你用docker run启动,示例如下:
docker run -d --name nginx \ -p 80:80 -p 443:443 -p 5432:5432 \ # 新增5432端口映射 -v 你的nginx.conf路径:/etc/nginx/nginx.conf \ -v 你的conf.d路径:/etc/nginx/conf.d \ --network 你和PG共用的Docker网络名 \ nginx:latest
如果用docker-compose部署,只需要在nginx服务的ports配置项中新增- "5432:5432"即可。
4. 外部数据库客户端配置
直接按如下参数配置即可:
- 主机地址:
123.4.5.6 - 端口:
5432 - 数据库名称:你的实际数据库名(即你原需求中的
db-name) - 用户名、密码:填写你PostgreSQL数据库配置的对应账号密码即可
内容的提问来源于stack exchange,提问作者JeanJacques
相关产品推荐
相关产品推荐

