将Django连接至Google Cloud Compute Engine的PostgreSQL数据库遇阻
Django从GAE转GCE后Cloud SQL连接问题解决
问题出在App Engine标准环境会自动挂载Cloud SQL的Unix套接字路径,但Compute Engine不会。你当前配置里的HOST用的是/cloudsql/...这种本地套接字路径,GCE实例上不存在这个路径,所以连不上数据库。
下面给两种可行的解决办法:
办法1:用公网IP直接连接
把数据库配置里的HOST换成Cloud SQL实例的公网IP,同时要做两件事:
- 打开Cloud SQL实例的公网访问开关
- 把GCE实例的外部IP加到Cloud SQL的授权网络列表里
修改后的配置示例:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'HOST': '123.45.67.89', # 替换成你的Cloud SQL公网IP 'NAME': 'mydatabasename', 'USER': 'myusername', 'PASSWORD': 'mypassword', 'PORT': '5432', } }
办法2:用Cloud SQL Auth Proxy连接(更安全,推荐)
这个方式不用开公网IP,通过代理建立加密连接:
- 在GCE实例上下载并安装代理:
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy chmod +x cloud_sql_proxy - 启动代理,替换成你的实例连接名:
./cloud_sql_proxy -instances=myproject:us-central1:mypostgresname=tcp:5432 & - 修改Django的数据库配置,把
HOST改成127.0.0.1:DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'HOST': '127.0.0.1', 'NAME': 'mydatabasename', 'USER': 'myusername', 'PASSWORD': 'mypassword', 'PORT': '5432', } } - 可以把代理启动命令加到实例的启动脚本里,这样重启实例后代理会自动运行。
额外要检查的点
- 确认GCE实例的服务账号确实有
Cloud SQL Client角色权限(哪怕和GAE权限一样,再核对一遍) - 确保Cloud SQL实例处于运行状态
- 测试GCE实例能不能通Cloud SQL的5432端口,用
telnet <SQL_IP> 5432或者nc -zv <SQL_IP> 5432试试
内容的提问来源于stack exchange,提问作者Anthony M
相关产品推荐
相关产品推荐

