部署在Google App Engine的Django应用无法连接Google Cloud SQL
Django部署至Google App Engine后无法连接Cloud SQL
本地运行正常,但部署后出现连接错误:
could not connect to server: Connection refused
Is the server running on host "127.0.0.1" and accepting
TCP/IP connections on port 5432?
settings.py代码片段
DATABASES = {"default": env.db()} # If the flag as been set, configure to use proxy if os.getenv("USE_CLOUD_SQL_AUTH_PROXY", None): DATABASES["default"]["HOST"] = "127.0.0.1" DATABASES["default"]["PORT"] = 5432 # [END gaestd_py_django_database_config] # [END db_setup] # Use a in-memory sqlite3 database when testing in CI systems # TODO(glasnt) CHECK IF THIS IS REQUIRED because we're setting a val above if os.getenv("TRAMPOLINE_CI", None): DATABASES = { "default": { "ENGINE": "django.db.backends.sqlite3", "NAME": os.path.join(BASE_DIR, "db.sqlite3"), } }
已按官方指南配置应用,Cloud SQL网络标签页显示**"App Engine授权:默认授权此项目中的所有应用。"**
已尝试的排查步骤:
- 启用Cloud SQL Admin API
- 为App Engine服务账号添加Cloud SQL Admin角色
- 测试App Engine到SQL实例的连通性
- 重启Cloud SQL实例和App Engine实例
- 云控制台日志报错:
psycopg2.OperationalError: could not connect to server: Connection refused at .connect ( /layers/google.python.pip/pip/lib/python3.9/site-packages/psycopg2/__init.py:122 ) at .get_new_connection ( /layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/backends/postgresql/base.py:215 ) at .inner ( /layers/google.python.pip/pip/lib/python3.9/site-packages/django/utils/asyncio.py:26 ) at .connect ( /layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/backends/base/base.py:263 ) at .inner ( /layers/google.python.pip/pip/lib/python3.9/site-packages/django/utils/asyncio.py:26 ) at .ensure_connection ( /layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/backends/base/base.py:282 )
解决方法
1. 确认USE_CLOUD_SQL_AUTH_PROXY环境变量配置
部署到App Engine时,需在app.yaml中明确设置该变量为true,否则代码不会触发代理连接逻辑:
env_variables: USE_CLOUD_SQL_AUTH_PROXY: 'true'
2. 检查数据库连接URL格式
env.db()依赖DATABASE_URL环境变量,需确保其格式正确:postgres://<用户名>:<密码>@/<数据库名>?host=/cloudsql/<项目ID>:<区域>:<实例名>
3. 补全服务账号权限
除Cloud SQL Admin角色外,需为App Engine服务账号添加Cloud SQL Client角色,该角色负责实际的数据库连接权限。
4. 配置Cloud SQL实例连接信息
在app.yaml中添加实例连接名称,确保代理能正确关联到目标实例:
beta_settings: cloud_sql_instances: <项目ID>:<区域>:<实例名>
若不使用代理,需将settings.py中的HOST直接设为实例连接名称,而非127.0.0.1。
5. 验证数据库用户权限
确认数据库用户拥有目标数据库的读写权限,密码未过期、未被锁定。
内容的提问来源于stack exchange,提问作者Ayush Agarwalla
相关产品推荐
相关产品推荐

