部署在App Engine的Symfony应用连接Cloud SQL遇Connection refused错误
解决Symfony部署Google App Engine标准环境的数据库连接与缓存问题
一、修复Cloud SQL数据库连接配置
你当前的DATABASE_URL格式完全错误,正确的MySQL连接字符串得包含用户名、密码,而且Unix Socket路径格式要符合Cloud SQL的要求:
- 正确的DATABASE_URL格式
DATABASE_URL="mysql://DB_USER:DB_PASSWORD@localhost/DB_NAME?unix_socket=/cloudsql/PROJECT_ID:REGION:INSTANCE_NAME"
- 把
DB_USER换成Cloud SQL实例的数据库用户名(默认是root,建议单独创建专用用户) DB_PASSWORD填对应用户的密码DB_NAME替换成你创建的数据库名称PROJECT_ID:REGION:INSTANCE_NAME是Cloud SQL实例的完整标识符,在控制台实例详情页就能找到
- 必须在app.yaml里关联Cloud SQL实例
在app.yaml中加以下配置,保证GAE服务能访问到Cloud SQL:
env_variables: DATABASE_URL: "mysql://DB_USER:DB_PASSWORD@localhost/DB_NAME?unix_socket=/cloudsql/PROJECT_ID:REGION:INSTANCE_NAME" beta_settings: cloud_sql_instances: "PROJECT_ID:REGION:INSTANCE_NAME"
注意:别直接在.env里硬写生产环境的敏感信息(比如密码),建议用GAE的环境变量管理,或者Secret Manager来存。
- 检查权限
确认你的GAE服务账号(默认是PROJECT_ID@appspot.gserviceaccount.com)有Cloud SQL Client角色:
- 进Google Cloud控制台 → IAM与管理员 → IAM
- 找到对应服务账号,添加
Cloud SQL > Cloud SQL Client角色
二、解决只读文件系统的缓存保存失败问题
GAE标准环境里,var/目录是只读的,Symfony默认把缓存和会话存在这里肯定报错,给你两种解决办法:
方案1:把缓存目录换到/tmp(临时可写目录)
修改config/packages/framework.yaml里的缓存配置:
framework: cache: app: cache.adapter.filesystem pools: cache.app: adapter: cache.adapter.filesystem directory: '%kernel.project_dir%/tmp/cache'
同时把tmp目录加到.gitignore里,部署前确保本地有这个目录(或者GAE会自动创建,但提前建更稳妥)。
方案2:用Google Cloud Storage或Redis做缓存适配器
生产环境更稳定的做法是用云端缓存服务:
- Redis:开个Memorystore for Redis实例,然后改Symfony的缓存配置指向这个Redis实例就行。
- Cloud Storage:用GCS作为文件缓存的后端,通过Symfony的GCS适配器来实现。
另外,会话存储也得改,别用文件会话,比如改成存在数据库里:
framework: session: handler_id: Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler save_path: null
用PdoSessionHandler会把会话存在你的Cloud SQL数据库里,适配GAE环境。
最后,部署前先清掉本地缓存,再用gcloud app deploy重新部署,之后用gcloud app logs tail -s default看日志确认问题解决没。
内容的提问来源于stack exchange,提问作者A. Cedano
相关产品推荐
相关产品推荐

