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
相关产品推荐
相关产品推荐

