升级Phusion Passenger至5.3.0后Nginx上Rails应用启动失败报断言错误
解决Passenger 5.3.0升级后断言失败(
!shell.empty())的问题 这个报错是Passenger 5.3.0版本的已知兼容性bug,主要发生在应用运行用户的默认shell为非交互式shell(比如/usr/sbin/nologin、/bin/false)或者shell配置异常的场景下。下面是几个经过验证的解决办法,按推荐优先级排序:
方法1:指定Passenger使用的Shell(最安全,不影响其他配置)
在你的Nginx配置文件中(通常位于/etc/nginx/sites-available/你的应用配置),在server块或者http全局块中添加以下指令,强制Passenger使用标准交互式shell:
passenger_shell /bin/bash;
或者如果系统里只有sh的话,用:
passenger_shell /bin/sh;
添加完成后,重启Nginx服务生效:
sudo service nginx restart
方法2:升级到修复后的Passenger版本
这个bug在Passenger 5.3.1及后续版本中已经被官方修复,你可以直接升级到最新的稳定版本:
sudo apt-get update sudo apt-get install --only-upgrade passenger
升级完成后重启Nginx:
sudo service nginx restart
方法3:降级到之前的稳定版Passenger
如果暂时不想升级到新版本,可以降级到5.2.x系列的稳定版本(比如5.2.3),这个版本和你的Rails 4.2、Ruby 2.4.4兼容性很好:
# 先卸载当前版本 sudo apt-get remove passenger # 安装指定版本(注意根据你的Ubuntu/Debian版本调整后缀,比如~trusty1、~xenial1) sudo apt-get install passenger=5.2.3-1~bionic1
完成后同样需要重启Nginx服务。
方法4:修改应用运行用户的默认Shell
如果你的应用是用www-data或者其他系统用户运行的,可以修改该用户的默认Shell为bash:
sudo chsh -s /bin/bash www-data
修改后重启Nginx和Passenger服务即可。不过这个方法可能会影响该用户运行的其他服务,所以谨慎使用。
内容的提问来源于stack exchange,提问作者Mike Pollitt
相关产品推荐
相关产品推荐

