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

EC2上Django容器连接本地Ubuntu服务器PostgreSQL容器问题咨询

环境部署情况

  • EC2实例上运行Django容器、PostgreSQL容器及Nginx代理
  • 本地Ubuntu服务器上运行另一个PostgreSQL容器
  • 需求:让Django容器连接本地Ubuntu上的PostgreSQL容器读取数据

配置信息

  • Django已配置远程数据库参数
  • 数据库配置代码(变量均在.env文件中定义):
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'HOST': os.environ.get('DB_HOST'),
        'NAME': os.environ.get('DB_NAME'),
        'USER': os.environ.get('DB_USER'),
        'PASSWORD': os.environ.get('DB_PASS')
    },
    'nlp_data': {
        'ENGINE': 'django.db.backends.postgresql',
        'HOST': os.environ.get('NLP_DB_HOST'),
        'NAME': os.environ.get('NLP_DB_NAME'),
        'USER': os.environ.get('NLP_DB_USER'),
        'PASSWORD': os.environ.get('NLP_DB_PASS')
    }
}

遇到的问题

  1. 本地Ubuntu服务器上的PostgreSQL容器,Django配置里的NLP_DB_HOST应该填该服务器的公网IP吗?
  2. 当前连接出现超时错误(推测Django容器无法访问本地数据库服务器),有没有高效的网络调试方法?

已尝试操作

  • 已将NLP_DB_HOST设为本地Ubuntu服务器的公网IP,但问题未解决,也未获得有效排查信息

解决方案与调试步骤

关于数据库主机地址的疑问

是的,NLP_DB_HOST需要填本地Ubuntu服务器的公网IP,但需满足两个前提:

  • 本地Ubuntu服务器的公网IP可被EC2实例访问(无运营商NAT屏蔽、具备公网出口)
  • 本地PostgreSQL容器的默认端口5432已映射到Ubuntu服务器的主机端口(启动容器时需添加-p 5432:5432参数)

网络超时问题的调试步骤

按以下顺序逐步排查:

1. 从EC2实例主机测试连通性

跳过容器,直接在EC2实例系统上验证网络:

# 测试能否ping通本地Ubuntu公网IP
ping <本地Ubuntu公网IP>

# 测试能否访问PostgreSQL的5432端口
nc -zv <本地Ubuntu公网IP> 5432
# 无nc的话用telnet
telnet <本地Ubuntu公网IP> 5432

若这一步失败,说明问题出在基础网络:

  • 检查本地Ubuntu服务器的防火墙(ufw/iptables)是否开放5432端口,允许EC2实例IP访问
  • 若为家用网络,需在路由器上配置端口转发,将5432端口指向Ubuntu服务器的内网IP
  • 检查EC2实例的安全组是否允许出站访问5432端口

2. 在Django容器内部测试连通性

如果EC2主机能连通,进入Django容器内部再验证:

# 查找Django容器ID/名称
docker ps
# 进入容器
docker exec -it <Django容器ID/名称> bash

# 若容器无测试工具,先安装
apt update && apt install iputils-ping netcat-traditional

# 执行连通测试
ping <本地Ubuntu公网IP>
nc -zv <本地Ubuntu公网IP> 5432

若容器内无法连通,排查Docker网络配置:

  • 确认Django容器使用默认bridge模式(或自定义网络允许出站)
  • 检查Docker主机的iptables规则是否限制了容器出站流量

3. 检查PostgreSQL容器的访问权限

PostgreSQL默认仅允许本地访问,需修改配置:

  • 修改postgresql.conf,设置listen_addresses = '*'(允许所有IP访问)
  • 修改pg_hba.conf,添加授权规则:
    host    <NLP_DB_NAME>    <NLP_DB_USER>    <EC2实例公网IP>/32    scram-sha-256
    
    测试阶段可临时允许所有IP(生产环境禁用):
    host    <NLP_DB_NAME>    <NLP_DB_USER>    0.0.0.0/0    scram-sha-256
    

修改后重启PostgreSQL容器:

docker restart <PostgreSQL容器ID/名称>

4. 验证Django环境变量

确保容器内.env变量正确加载:

# 进入Django容器后执行
echo $NLP_DB_HOST
echo $NLP_DB_NAME
echo $NLP_DB_USER

确认变量值与预期一致,排除环境变量未正确注入的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:32:54