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

GCP Ubuntu虚拟机Django应用PostgreSQL远程连接超时求助

问题:GCP Ubuntu 22.04虚拟机上PostgreSQL无法远程连接(超时错误)

我在GCP的Ubuntu 22.04 LTS虚拟机上部署了Django应用,应用运行正常,但无法远程访问配套的PostgreSQL数据库,始终出现连接超时错误。

已完成的配置操作

1. Django settings.py配置

....
DATABASES = {
    'default': {
        'ENGINE': os.environ.get('DATABASE_ENGINE'),
        'NAME': os.environ.get('DATABASE_NAME'),
        'USER': os.environ.get('DATABASE_USER'),
        'PASSWORD': os.environ.get('DATABASE_PASSWORD'),
        'HOST': os.environ.get('DATABASE_HOST'),
        'PORT': os.environ.get('DATABASE_PORT'),
    }
}
...

2. .env环境变量文件

# Postgres
DATABASE_ENGINE = 'django.db.backends.postgresql'
DATABASE_NAME = "basededados"
DATABASE_USER = "user"
DATABASE_PASSWORD = "senha"
DATABASE_HOST = "127.0.0.1"
DATABASE_PORT = "5432"

3. 数据库创建语句

sudo -u postgres psql
CREATE ROLE user WITH LOGIN SUPERUSER CREATEDB CREATEROLE PASSWORD 'senha';
CREATE DATABASE basededados WITH OWNER user;
GRANT ALL PRIVILEGES ON DATABASE basededados TO user;

4. PostgreSQL核心配置修改

  • postgres.conf文件:
listen_addresses = '*'
  • pg_hba.conf文件:
# IPv4 local connections:
host    all             all             0.0.0.0/0            md5

5. 本地防火墙配置

sudo ufw allow 5432/tcp

测试命令及错误信息

执行远程连接命令:

psql -h {虚拟机IP} -d basededados -U user

返回错误:

psql: error: connection to server at {虚拟机IP}, port 5432 failed: Connection timed out
        Is the server running on that host and accepting TCP/IP connections?

问题排查及解决步骤

1. 重启PostgreSQL服务生效配置

修改postgres.conf和pg_hba.conf后,必须重启服务才能让配置生效:

sudo systemctl restart postgresql

可通过以下命令验证服务状态和监听端口:

sudo systemctl status postgresql
sudo ss -tulpn | grep 5432

若输出中没有0.0.0.0:5432或:::5432,说明监听配置未生效,需检查配置文件路径是否正确(不同PostgreSQL版本路径可能不同,例如/etc/postgresql/14/main/postgres.conf)。

2. 配置GCP云层面防火墙规则

GCP虚拟机本地UFW允许端口后,云层面防火墙默认会拦截外部对5432端口的访问,这是最容易遗漏的环节:

  • 登录GCP控制台,进入目标VM实例页面
  • 点击顶部「防火墙」→「创建防火墙规则」
  • 规则配置要点:
    • 名称:自定义(如allow-postgres-5432)
    • 网络:选择VM所在的VPC网络
    • 方向:入口
    • 动作:允许
    • 目标:可指定VM的标签(需提前给VM添加对应标签,如postgres-server),或选择「所有实例在网络中」
    • 源IPv4范围:若需开放给所有IP填0.0.0.0/0,仅允许特定IP则填对应网段(更安全)
    • 协议和端口:勾选tcp,填入5432
  • 保存规则后等待数分钟再测试连接

3. 确认使用虚拟机外部IP

确保连接时使用的是VM的外部IP,而非内部IP。可在GCP VM实例页面查看「外部IP」字段,或在VM内执行以下命令获取:

curl ifconfig.me

4. 验证数据库用户的远程连接权限

虽然pg_hba.conf已允许全局访问,仍需确认用户user是否支持远程连接:
登录PostgreSQL:

sudo -u postgres psql

执行命令查看用户权限:

SELECT rolname, rolhost FROM pg_roles WHERE rolname='user';

若rolhost为NULL则允许任意主机连接;若为特定IP,需修改为允许所有主机:

ALTER ROLE user WITH LOGIN PASSWORD 'senha' HOST '%';

修改后重启PostgreSQL服务。

5. 检查VM标签与防火墙规则的关联

若GCP防火墙规则使用了目标标签,需确保VM已添加对应标签:

  • 进入VM实例页面,点击「编辑」
  • 在「网络标签」处添加防火墙规则中设置的标签(如postgres-server)
  • 保存修改

6. 测试端口可达性

用以下命令验证端口是否对外开放:

telnet {虚拟机外部IP} 5432
# 或使用nc命令
nc -zv {虚拟机外部IP} 5432

若连接失败,说明网络层面仍有拦截,重点排查GCP云防火墙规则。


内容的提问来源于stack exchange,提问作者Leonardo do Nascimento Mattos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:25:09