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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:15:05