首次通过Capistrano在EC2部署Rails应用遇Puma问题求助
嘿,这种情况我之前在EC2上部署Rails应用时也踩过好几次坑,核心问题基本就是Puma没正常启动,导致Nginx找不到socket文件没法和应用建立连接。咱们一步步来排查解决:
1. 先查Puma的运行状态和日志
先SSH登录你的EC2服务器,直奔应用目录(一般是/var/www/你的应用名/current),先确认Puma有没有在运行:
ps aux | grep puma
如果输出里看不到Puma相关进程,那肯定是没启动成功。接下来去看Puma的日志找线索,日志一般存在应用的shared/log目录下:
cd /var/www/你的应用名/shared/log cat puma.stdout.log cat puma.stderr.log
这里大概率会有明确报错——比如依赖gem没安装全(虽然Capistrano会执行bundle install,但权限问题可能导致安装失败)、环境变量没配置对(比如RAILS_ENV没设成production,或者数据库连接信息有误)、端口被占用,甚至是config/puma.rb里的配置写错了。
2. 手动启动Puma测试
如果日志里没找到明确问题,试试手动启动Puma,看能不能直接在终端看到报错:
cd /var/www/你的应用名/current RAILS_ENV=production bundle exec puma -C config/puma.rb
启动时如果有报错会直接输出,比如某个gem缺失、配置文件语法错误,或者socket目录不存在。
针对你提到的「puma.sock应存在的目录为空」,先确认config/puma.rb里的socket路径配置是否正确:
bind "unix:///var/www/你的应用名/shared/tmp/sockets/puma.sock"
如果这个路径对应的目录不存在,手动创建并设置权限:
mkdir -p /var/www/你的应用名/shared/tmp/sockets chown -R 你的部署用户名:你的部署用户名 /var/www/你的应用名/shared/tmp # 比如部署用户是deploy就写deploy:deploy
3. 检查Capistrano的Puma插件配置
既然用了cap production deploy,应该是用了capistrano-puma插件吧?先确认Capfile里有没有加载插件:
require 'capistrano/puma' install_plugin Capistrano::Puma
再看config/deploy.rb里的Puma相关配置,比如socket路径是否和config/puma.rb一致,有没有启用自动启动/重启Puma的任务。如果部署后Puma没自动启动,试试手动执行Capistrano的Puma重启命令:
cap production puma:restart
执行完再去socket目录看有没有生成puma.sock文件。
4. 权限问题(最容易踩的坑!)
EC2上的部署用户(比如deploy)和Nginx运行用户(一般是www-data)的权限必须对齐,否则Nginx会读不到Puma的socket文件。给socket目录设置正确的权限:
chmod -R 775 /var/www/你的应用名/shared/tmp/sockets chown -R 你的部署用户名:www-data /var/www/你的应用名/shared/tmp/sockets
或者直接在config/puma.rb里设置socket的权限:
bind "unix:///var/www/你的应用名/shared/tmp/sockets/puma.sock", perm: 0660
这样Nginx就能正常访问这个socket文件了。
5. 最后核对Nginx配置
虽然你重启了Nginx,但还是要确认Nginx的upstream配置是不是指向正确的socket路径:
upstream 你的应用名 { server unix:/var/www/你的应用名/shared/tmp/sockets/puma.sock fail_timeout=0; }
然后测试Nginx配置是否合法:
sudo nginx -t
如果配置有语法错误,重启Nginx也没用,得先修正配置再执行sudo systemctl restart nginx。
内容的提问来源于stack exchange,提问作者mattC

