升级Ruby与Rails后Apache Passenger部署Rails应用Projects失败求助
Rails 6.1 + Ruby 3.3.1 + Passenger启动失败排查方案
三个从单体拆分的Rails应用(UAM、Proposals、Projects)完成Rails 5.2→6.1.7.7、Ruby 2.7.4→3.3.1升级后,UAM和Proposals可在Apache 2.4+Passenger环境正常部署运行,但Projects的所有实例启动失败,报错:
+ exec /opt/rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/passenger-6.0.22/buildout/support-binaries/PassengerAgent spawn-env-setupper /tmp/passenger.spawn.XXXXLXAXEL --after /opt/rbenv/versions/3.3.1/bin/ruby: No such file or directory -- Passenger AppPreloader: /opt/projects_int2/current (LoadError)本地可正常启动
rails console和Puma运行应用,目录权限与另外两个应用一致(www-data可访问),虚拟主机配置仅目录/主机名不同,旧版本配置可正常运行。已升级至最新Passenger、设置默认Ruby版本、尝试Passenger standalone均失败。
排查步骤
1. 确认Passenger与Ruby 3.3.1的兼容性及编译状态
- 旧版Passenger(如6.0.22)对Ruby 3.3.x的支持可能存在问题,即使升级到最新Passenger,需确保针对Ruby 3.3.1重新编译Apache模块:
执行时需选择Ruby 3.3.1的路径,完成后更新Apache的Passenger配置文件(如passenger-install-apache2-module/etc/apache2/mods-available/passenger.conf),确保PassengerRuby、PassengerRoot等路径指向正确版本。 - 运行
passenger-config about ruby-command,验证Passenger关联的Ruby版本是否为3.3.1。
2. 确保Apache进程加载rbenv环境
- Apache运行时的环境变量与终端不同,需在Apache配置中明确指定Ruby路径,并加载rbenv:
- 在虚拟主机配置中设置完整的Ruby路径:
PassengerRuby /opt/rbenv/versions/3.3.1/bin/ruby - 在
/etc/apache2/envvars中添加rbenv路径:export PATH="/opt/rbenv/shims:/opt/rbenv/bin:$PATH"
systemctl restart apache2 - 在虚拟主机配置中设置完整的Ruby路径:
3. 检查Projects应用的特殊配置与启动日志
- 对比Projects与UAM/Proposals的配置文件,查看是否存在Passenger/preloader相关的差异设置,比如
config/environments/production.rb中的config.preload_frameworks,或虚拟主机中的PassengerPreload指令。 - 开启Passenger详细日志排查:在虚拟主机配置中添加
PassengerLogLevel 3,重启Apache后查看/var/log/apache2/error.log或Passenger日志文件,获取更详细的加载错误信息(如具体哪个文件无法加载)。
4. 验证应用目录的符号链接与权限
- 如果
/opt/projects_int2/current是符号链接,检查其指向的真实目录是否存在,且www-data用户拥有进入目录的权限(目录需有执行权限x):
确保真实目录的权限链(从根目录到应用目录)都允许www-data访问。ls -l /opt/projects_int2/current sudo -u www-data ls /opt/projects_int2/current/config
5. 确认Ruby 3.3.1的gem依赖完整性
- 在应用目录下,使用Ruby 3.3.1的bundle重新安装依赖:
/opt/rbenv/versions/3.3.1/bin/bundle install - 检查项目目录下的
.ruby-version或.rbenv-version文件,确认其内容为3.3.1,避免Passenger加载错误的Ruby版本。
6. 排查Passenger standalone的启动细节
- 运行Passenger standalone并开启debug日志:
查看输出日志,定位preloader启动失败的具体原因,比如初始化脚本错误、环境变量缺失等。cd /opt/projects_int2/current passenger start --port 3000 --log-level debug
内容的提问来源于stack exchange,提问作者Ed Allen
相关产品推荐
相关产品推荐

