You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby on Rails站点重启后部分页面500错误排查求助

排查步骤与解决方案

1. 定位具体错误栈

先获取production.log中TypeError的完整调用栈,这是定位问题的核心:

tail -n 100 /var/www/vhosts/myapp/current/log/production.log

找到触发no implicit conversion of nil into String的具体代码文件、行号,确认是哪个变量未正确赋值导致nil。

2. 检查环境变量完整性

Droplet重启后可能丢失环境变量,Rails依赖的关键配置(如SECRET_KEY_BASE、第三方服务密钥)缺失会引发500错误:

  • 查看Capistrano共享目录下的环境配置文件(若用Figaro等工具):
    cat /var/www/vhosts/myapp/shared/config/application.yml
    
  • 验证Puma启动时的环境变量:
    ps aux | grep puma
    
    确认启动命令包含RAILS_ENV=production,且关键环境变量已加载。

3. 修正Unix Socket权限

即使Socket文件存在,Nginx进程(通常为www-data)可能无读写权限:

  • 检查Socket权限与归属:
    ls -l /var/www/vhosts/myapp/shared/tmp/sockets/myapp-puma.sock
    
  • 调整权限(假设Puma运行用户为deploy):
    chown deploy:www-data /var/www/vhosts/myapp/shared/tmp/sockets/myapp-puma.sock
    chmod 775 /var/www/vhosts/myapp/shared/tmp/sockets/myapp-puma.sock
    
  • 可在config/puma.rb中添加umask 0002,确保后续重启Puma时自动设置正确权限。

4. 清理Rails缓存与预编译资源

重启后缓存损坏或资产预编译文件缺失可能导致部分页面失效:

cd /var/www/vhosts/myapp/current
# 清除缓存
bundle exec rails cache:clear
# 重新预编译生产环境资产
RAILS_ENV=production bundle exec rails assets:precompile
# 清理tmp目录并重建必要子目录
rm -rf tmp/* && mkdir -p tmp/sockets tmp/pids

5. 验证Puma进程健康状态

检查Puma是否正常运行并处理请求:

  • 查看Puma状态:
    cd /var/www/vhosts/myapp/current
    bundle exec pumactl -S /var/www/vhosts/myapp/shared/tmp/pids/puma.state status
    
  • 若状态异常,强制重启Puma:
    bundle exec pumactl -S /var/www/vhosts/myapp/shared/tmp/pids/puma.state restart
    
  • 查看Puma运行日志:
    tail -n 50 /var/www/vhosts/myapp/shared/log/puma.log
    

6. 确认源码完整性

由于仅服务器有源码,需验证当前部署版本是否存在文件缺失:

  • 若服务器保留Git仓库,检查代码状态:
    cd /var/www/vhosts/myapp/current && git status
    
  • 切换至Capistrano历史版本测试:
    # 查看所有发布版本
    ls -la /var/www/vhosts/myapp/releases/
    # 切换至之前正常的版本(替换[timestamp]为对应版本目录名)
    ln -sf /var/www/vhosts/myapp/releases/[timestamp] /var/www/vhosts/myapp/current
    # 重启服务
    sudo systemctl restart nginx
    bundle exec pumactl -S /var/www/vhosts/myapp/shared/tmp/pids/puma.state restart
    

7. 验证数据库查询逻辑

部分页面的500可能源于特定数据库查询异常,而非全局连接问题:

  • 进入生产环境Rails控制台:
    RAILS_ENV=production bundle exec rails c
    
  • 手动执行报错页面的相关模型操作(如Post.last、User.find(1)),确认是否存在数据关联或查询错误。

内容的提问来源于stack exchange,提问作者Jae

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:55:34