Rails应用部署至AWS EC2生产环境后无法定位错误日志求助
排查Rails生产环境经典错误页面的建议
针对你遇到的问题——本地运行正常但AWS EC2生产环境出现Rails经典错误页面,且日志未捕获详细错误,结合nginx的upstream prematurely closed connection提示,我整理了以下排查步骤:
1. 调整Rails日志级别以捕获详细错误
你当前的config.log_level = :info会过滤掉debug和error级别的详细信息,建议临时修改生产环境配置:
- 打开
config/environments/production.rb,将config.log_level = :info改为config.log_level = :debug - 重启Unicorn服务器(比如
service unicorn_myapp restart,具体命令根据你的部署脚本调整) - 再次访问出错的页面,然后查看
log/production.log,此时应该会记录更详细的错误堆栈信息
2. 检查Unicorn的专属日志
nginx提示上游连接提前关闭,大概率是Unicorn进程在处理请求时出错或崩溃了,而Unicorn有自己的独立日志:
- 通常Unicorn的错误日志会存放在
log/unicorn.stderr.log,标准输出日志在log/unicorn.stdout.log - 如果你的Unicorn配置文件(比如
config/unicorn.rb)指定了自定义日志路径,去对应位置查看 - 这里很可能会找到Rails进程崩溃的具体原因,比如资产预编译失败、依赖缺失、内存不足等
3. 验证资产预编译是否成功
你怀疑错误与资源预编译有关,可以按以下步骤验证:
- 在生产环境服务器上执行预编译命令:
RAILS_ENV=production bundle exec rake assets:precompile - 检查
public/assets目录下是否存在你新增的HTML/图片对应的编译后文件(注意Rails会给资产加哈希后缀) - 确保
public/assets目录的权限正确,nginx运行用户(通常是www-data)有读取权限:chmod -R 755 public/assets chown -R www-data:www-data public/assets
4. 临时开启本地调试模式(仅限测试)
如果日志还是没找到问题,可以临时让生产环境显示详细错误页面(注意测试后立即改回,避免安全风险):
- 修改
config/environments/production.rb:config.consider_all_requests_local = true config.action_dispatch.show_exceptions = true - 重启服务器后访问页面,此时会直接显示完整的错误堆栈,能快速定位问题
5. 检查系统级日志与资源限制
有时候进程崩溃是系统级问题,比如内存不足被OOM Killer终止:
- 查看系统日志(Ubuntu/Debian是
/var/log/syslog,CentOS是/var/log/messages),搜索unicorn或ruby相关的条目,看是否有进程被kill的记录 - 检查EC2实例的内存使用情况,执行
free -h或top命令,确认是否内存不足导致Unicorn进程崩溃
6. 验证Rollbar配置是否生效
如果Rollbar没捕获到错误,可能是配置问题:
- 打开
config/initializers/rollbar.rb,确认生产环境下Rollbar已启用:Rollbar.configure do |config| config.enabled = true if Rails.env.production? # 确认access token已正确配置 end - 可以手动测试Rollbar是否能发送错误,在生产环境控制台执行:
然后查看Rollbar后台是否收到这条测试错误Rollbar.error("Test error from production")
7. 检查服务器权限与临时目录
Unicorn需要读写临时目录来运行,权限不足也会导致连接问题:
- 确保
tmp/sockets、tmp/pids、tmp/cache目录存在且权限正确:mkdir -p tmp/sockets tmp/pids tmp/cache chmod -R 775 tmp chown -R deploy:deploy tmp # 这里的deploy是你运行Unicorn的用户,根据实际情况调整
内容的提问来源于stack exchange,提问作者user2932090
相关产品推荐
相关产品推荐

