Capistrano部署Rails应用到AWS EC2后Puma重启失败求助
核心问题说明
你的错误核心是Capistrano配置为使用systemd管理Puma服务,但你的EC2服务器上不存在名为puma_<app-name>_production的systemd服务单元,导致重启失败。
解决步骤
第一步:登录EC2服务器确认Puma服务状态
先SSH登录到你的AWS EC2实例,执行以下命令查看现有Puma相关服务:sudo systemctl list-units --type=service | grep puma同时执行命令检查是否有正在运行的Puma进程:
ps aux | grep puma第二步:根据检查结果对应处理
情况A:能查到正在运行的Puma进程,但查不到systemd服务
说明前任工程师没有使用systemd管理Puma,你需要修改本地Capistrano配置,关闭systemd管理选项:
打开项目下的config/deploy/production.rb文件,删除或注释掉set :puma_systemd_service, true这类配置,改回默认的Puma管理方式后重新部署即可。情况B:能查到Puma的systemd服务,但名称不是
puma_<app-name>_production
直接在config/deploy/production.rb中添加配置,指定正确的服务名即可:
set :puma_service_name, "你实际查到的Puma服务名"- 情况C:完全没有运行的Puma进程,也查不到对应systemd服务
说明服务器上还未配置Puma的systemd服务,直接在本地项目根目录执行以下命令,自动生成并上传服务配置到服务器:
bundle exec cap production puma:systemd:install执行完成后登录服务器重载systemd配置:
sudo systemctl daemon-reload手动启动一次Puma服务验证是否正常:
sudo systemctl start puma_<app-name>_production执行
sudo systemctl status puma_<app-name>_production确认服务运行正常后,再重新执行部署命令即可。额外注意项
如果启动Puma服务时报Ruby版本找不到的错误,检查systemd服务文件(默认路径为/etc/systemd/system/puma_<app-name>_production.service)中的Ruby执行路径,和服务器上实际的Ruby路径(可执行which ruby查看)是否一致,不一致的话修改服务文件后重载systemd配置即可。
内容的提问来源于stack exchange,提问作者SaryAssad

