在AWS Elastic Beanstalk部署RoR应用时遭遇数据库迁移错误
解决AWS Elastic Beanstalk部署RoR应用时PostgreSQL连接失败的问题
我之前在Elastic Beanstalk上部署Ruby on Rails应用时,也碰到过几乎一模一样的问题,核心就是Rails应用没法连接到PostgreSQL数据库,导致db:migrate任务执行失败。给你几个亲测有效的排查和解决方向:
1. 先检查PostgreSQL服务是否正常运行
登录到报错里的那个EC2实例(i-0c1d25d2a182d8424),先确认Postgres服务的状态:
sudo systemctl status postgresql
如果显示服务未启动,手动启动它:
sudo systemctl start postgresql
为了避免后续实例重启后服务又掉,顺便设置开机自启:
sudo systemctl enable postgresql
2. 验证PostgreSQL套接字路径的权限与存在性
错误提示里提到的Unix套接字路径/var/run/postgresql/.s.PGSQL.5432经常会因为权限或路径不存在导致连接失败:
- 先查看路径是否存在:
ls -la /var/run/postgresql/
- 如果路径不存在,手动创建并设置正确的权限:
sudo mkdir -p /var/run/postgresql/ sudo chown postgres:postgres /var/run/postgresql/ sudo chmod 775 /var/run/postgresql/
做完后重启Postgres服务:
sudo systemctl restart postgresql
3. 检查Rails数据库配置是否匹配EB环境
Elastic Beanstalk的PostgreSQL环境(不管是内置的还是关联RDS的),都会通过环境变量注入数据库连接信息,你的config/database.yml配置应该用环境变量而非硬编码:
production: adapter: postgresql encoding: unicode database: <%= ENV['RDS_DB_NAME'] %> username: <%= ENV['RDS_USERNAME'] %> password: <%= ENV['RDS_PASSWORD'] %> host: <%= ENV['RDS_HOSTNAME'] %> port: <%= ENV['RDS_PORT'] %>
注意不要在生产环境配置里写本地的Unix套接字路径,EB上的Postgres默认走TCP连接。
4. 确认关联的RDS实例状态(如果用了RDS)
如果你的EB环境关联了RDS托管的Postgres,去AWS控制台检查:
- RDS实例是否处于可用状态,没有停摆或维护中;
- RDS的安全组是否允许EB环境的EC2实例访问5432端口。
5. 重新触发部署并查看完整错误栈
如果上面的步骤都排查没问题,重新部署应用试试:
- 可以在EB控制台点击「部署」->「上传并部署」,重新上传应用包;
- 或者用EB CLI命令:
eb deploy
如果还是失败,加上--trace参数运行迁移命令,获取完整的调用栈来定位更细节的问题:
bundle exec rake db:migrate --trace
内容的提问来源于stack exchange,提问作者Giulio Colleluori
相关产品推荐
相关产品推荐

