EC2部署Rails7+Nginx+Passenger遇异常响应问题排查
部署异常排查方案
针对你在Ubuntu 22.04 EC2上部署Rails 7 + Nginx + Passenger遇到的三个阶段问题,逐一排查解决:
1. 初始配置返回Nginx默认页面
- 可能原因:新站点配置未正确启用,或Nginx未重新加载配置;也可能是
server_name localhost仅匹配localhost请求,用EC2公网IP/域名请求时匹配到了Nginx隐含的默认 fallback 配置。 - 解决步骤:
- 确认新站点已启用:执行
sudo ln -s /etc/nginx/sites-available/my_app /etc/nginx/sites-enabled/(若未执行过) - 重新加载Nginx配置:
sudo systemctl reload nginx - 修改
server_name为你的EC2公网IP或域名,比如server_name xxx.xxx.xxx.xxx;,避免仅匹配localhost请求。
- 确认新站点已启用:执行
2. 添加root路径后返回403 Forbidden
- 核心原因:
- 路径拼写错误:你实际应用目录是
/var/www/my_app/code,但配置里写的是/var/www/myapp/code/public(少了下划线_),导致Nginx找不到正确目录。 - 目录权限问题:
my_app用户对/var/www/my_app/code/public无读权限;或Nginx运行用户(已设为my_app)无法访问父目录。 - 未启用Passenger时,Nginx尝试列出
public目录索引,但Rails默认无index.html,且Nginx默认禁止目录索引。
- 路径拼写错误:你实际应用目录是
- 解决步骤:
- 修正路径:将
root改为/var/www/my_app/code/public(与实际目录完全一致) - 修复权限:
sudo chown -R my_app:my_app /var/www/my_app/code sudo chmod -R 755 /var/www/my_app/code/public - 若暂时未启用Passenger,可临时添加
index index.html;(Rails部署建议直接启用Passenger,无需此配置)
- 修正路径:将
3. 启用Passenger后返回301重定向到HTTPS
- 可能原因:
- Rails配置强制HTTPS:
config/environments/production.rb中config.force_ssl = true,导致Rails发送301跳转。 - Nginx配置中存在HTTPS跳转规则(可能是之前配置残留或Passenger默认规则)。
- Rails配置强制HTTPS:
- 解决步骤:
- 检查Rails生产环境配置:打开
/var/www/my_app/code/config/environments/production.rb,若暂未配置HTTPS,将config.force_ssl改为false,然后重启Passenger:sudo passenger-config restart-app /var/www/my_app/code - 检查Nginx站点配置:确保没有类似
return 301 https://$server_name$request_uri;的跳转规则。 - 后续若要配置HTTPS,需申请SSL证书(如Let's Encrypt)并配置Nginx的443端口,同时保留
config.force_ssl = true。
- 检查Rails生产环境配置:打开
额外验证步骤
- 确认Passenger与Ruby关联正常:执行
passenger-config about ruby-command,输出的Ruby路径需与mod-http-passenger.conf中指定的一致。 - 查看Passenger应用日志:
/var/log/passenger.log,若301跳转由Rails触发,这里会有相关记录。
内容的提问来源于stack exchange,提问作者hyperrjas
相关产品推荐
相关产品推荐

