加载未修改Rails应用遇Passenger Nginx栈溢出错误求助
我之前也碰到过类似的Passenger栈溢出问题,结合你的环境(Rails 5.2.2 + Ruby 2.5.5),可以试试下面这些排查和修复步骤:
确认Passenger使用的Ruby版本匹配
有时候Passenger会默认调用系统Ruby,而非你项目指定的版本。运行以下命令查看Passenger当前关联的Ruby信息:passenger-config about ruby-command如果输出的版本或路径和你的项目Ruby(2.5.5)不一致,在Nginx的server配置块里明确指定Ruby路径:
passenger_ruby /path/to/your/ruby-2.5.5/bin/ruby;比如RVM管理的Ruby路径可能是
/usr/local/rvm/rubies/ruby-2.5.5/bin/ruby,rbenv的话可能是~/.rbenv/versions/2.5.5/bin/ruby。排查Rails初始化阶段的递归调用
栈溢出几乎都是无限递归导致的,先确认问题是否出在Rails本身:- 进入项目目录手动启动Rails服务器:
如果本地启动也报cd /var/www/html/railapp && bundle exec rails sstack level too deep,说明问题在Rails代码或配置里,而非Passenger。 - 查看Passenger生成的错误详情文件
/tmp/passenger-error-Wc9XgI.html,里面有完整的调用栈,找到重复出现的方法——这就是递归的源头。常见原因包括自定义initializer里的无限循环、gem版本冲突引发的递归调用。 - 可以尝试临时注释
config/initializers/下的自定义初始化文件,逐个恢复排查,定位到引发问题的文件。
- 进入项目目录手动启动Rails服务器:
验证Gem依赖完整性
进入项目目录,重新安装并锁定gem依赖:bundle install --deploymentRails 5.2.2和Ruby 2.5.5是兼容的,但部分老旧gem可能在这个组合下出现异常,运行
bundle outdated检查是否有需要更新的关键gem(比如rack、activesupport等)。检查Passenger版本兼容性
确保你使用的Passenger版本支持Rails 5.2.2,建议升级到最新稳定版的Passenger,然后重启Nginx服务:sudo systemctl restart nginx确认文件权限
保证Nginx运行用户(通常是www-data)对项目目录拥有读写权限,尤其是tmp/和log/目录:sudo chown -R www-data:www-data /var/www/html/railapp sudo chmod -R 755 /var/www/html/railapp
如果以上步骤都无法解决问题,建议把/tmp/passenger-error-Wc9XgI.html里的调用栈信息贴出来,这样能更精准地定位递归源头。
内容的提问来源于stack exchange,提问作者uberdave

