我在 Google App Engine 上部署 Django 应用程序并尝试将其连接到 Google Cloud SQL 时遇到了问题。该应用程序在我的本地系统上完美运行,但是在部署时,我收到以下连接错误:
无法连接到服务器:连接被拒绝 服务器是否在主机“127.0.0.1”上运行并接受 端口 5432 上的 TCP/IP 连接?
这是我的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"),
}
}
我已按照 this 指南在 Google 应用引擎上设置我的应用程序。
这些是我迄今为止尝试过的所有故障排除步骤 -
启用了 Cloud SQL 管理 API。
向 App Engine 服务帐户添加了 Cloud SQL 管理员角色。
测试了从 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 )
我还检查了云 SQL 的“网络”选项卡,它显示“App Engine 授权:默认情况下此项目中的所有应用程序均已授权。”
看起来您可能在底层代码中发现了一个错误。
Cloud SQL 代理可以通过两种方式部署,即通过端口
127.0.0.1
在本地主机 5432
上使用 TCP 连接(如快速入门所示)(对于 Postgres,对于 MySQL 为 3306 等)。
这是代码的预期内容,也是您的部署在本地运行的原因:
# 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
Cloud SQL 代理还可以使用 Unix 套接字而不是 TCP 连接来部署。 App Engine 使用 Unix 套接字自动部署 Cloud SQL 代理,而NOT则通过 TCP。它期望你的主机是 Unix 套接字的路径
/cloudsql/PROJECT_ID:REGION:INSTANCE_NAME
此代码示例/快速入门的创建者似乎忘记了这个细节。我相信,如果您取消设置
USE_CLOUD_SQL_AUTH_PROXY
环境变量,则示例在部署到 App Engine 时应该可以正常工作,因为默认情况下代码会从之前步骤中创建的 .env
文件中查找正确的 Unix 套接字。
echo DATABASE_URL=postgres://DATABASE_USERNAME:DATABASE_PASSWORD@//cloudsql/PROJECT_ID:REGION:INSTANCE_NAME/DATABASE_NAME > .env
只要未设置
USE_CLOUD_SQL_AUTH_PROXY
或设置为 None
,就应将其设置为默认值
DATABASES = {"default": env.db()}
我将提交一个错误来更新此代码示例。