Redhat7.9下Apache/Passenger/Rails部署故障排查求助
解决Apache下Passenger无法加载bundler/setup的问题
在Redhat 7.9服务器上使用Ruby 2.7.4、Passenger 6.0.22部署Rails 7.0.8应用时,bundle exec passenger start独立模式运行正常,但通过Apache启动时出现cannot load such file -- bundler/setup错误,核心原因是Apache执行环境与终端环境的Ruby/Gem配置不一致。
1. 添加显示路径的调试信息
临时修改Ruby加载文件输出日志
编辑/usr/share/rubygems/rubygems/core_ext/kernel_require.rb,在出错的第55行前插入调试代码:
# 在return gem_original_require(path)前添加 puts "DEBUG: Require path: #{path}" puts "DEBUG: Current $LOAD_PATH:\n#{$LOAD_PATH.join("\n")}" puts "DEBUG: GEM_HOME: #{ENV['GEM_HOME']}" puts "DEBUG: GEM_PATH: #{ENV['GEM_PATH']}"
修改后重启Apache,查看Passenger日志即可获取加载路径和环境变量详情。
提升Passenger日志级别
在Apache全局配置或应用虚拟主机配置中添加:
PassengerLogLevel 3
这会让Passenger输出更详细的启动流程日志,包括环境变量和Gem加载过程。
在Rails入口添加调试代码
在应用根目录的config.ru开头插入:
puts "DEBUG: config.ru loaded with Ruby: #{RUBY_VERSION}" puts "DEBUG: GEM_HOME: #{ENV['GEM_HOME']}" puts "DEBUG: GEM_PATH: #{ENV['GEM_PATH']}" puts "DEBUG: $LOAD_PATH:\n#{$LOAD_PATH.join("\n")}"
启动Apache后,Passenger日志会输出这些信息,快速定位环境差异。
2. 需要检查的Gem列表
- bundler:确认版本与
Gemfile.lock一致,且属于Ruby 2.7.4环境:
若版本不匹配,执行rvm use 2.7.4 gem list bundlergem install bundler -v <Gemfile.lock中指定的版本>。 - passenger:验证Apache模块基于Ruby 2.7.4编译:
输出的Ruby路径必须指向RVM的2.7.4版本,而非系统默认的passenger-config about ruby-command/usr/bin/ruby。 - rack:Rails 7.0.8依赖特定版本的rack,确认已安装在对应Ruby环境:
rvm use 2.7.4 gem list rack - 系统Gem与RVM Gem:执行
gem env对比终端环境与Apache环境的Gem路径,排查冲突。
3. 需要检查的环境变量列表
Apache运行环境与终端环境的变量差异是核心问题,重点检查:
- PATH:必须包含RVM Ruby的bin目录(如
/home/<你的用户名>/.rvm/rubies/ruby-2.7.4/bin),优先于系统路径。 - GEM_HOME:指向RVM Ruby 2.7.4的Gem目录,如
/home/<你的用户名>/.rvm/gems/ruby-2.7.4。 - GEM_PATH:包含当前Ruby的Gem目录和global目录,如
/home/<你的用户名>/.rvm/gems/ruby-2.7.4:/home/<你的用户名>/.rvm/gems/ruby-2.7.4@global。 - PassengerRuby:Apache配置中必须明确指定RVM Ruby的完整路径,示例:
PassengerRuby /home/<你的用户名>/.rvm/wrappers/ruby-2.7.4/ruby - BUNDLE_GEMFILE:确保指向应用根目录的
Gemfile,可在虚拟主机配置中添加:SetEnv BUNDLE_GEMFILE /path/to/your/app/Gemfile
关键修复步骤
- 修正PassengerRuby配置:
编辑Apache的Passenger配置文件(通常是/etc/httpd/conf.d/passenger.conf),设置正确的Ruby路径:PassengerRoot /usr/share/passenger PassengerRuby /home/<你的用户名>/.rvm/wrappers/ruby-2.7.4/ruby - 添加环境变量到Apache配置:
在应用虚拟主机配置中插入:SetEnv GEM_HOME /home/<你的用户名>/.rvm/gems/ruby-2.7.4 SetEnv GEM_PATH /home/<你的用户名>/.rvm/gems/ruby-2.7.4:/home/<你的用户名>/.rvm/gems/ruby-2.7.4@global SetEnv PATH /home/<你的用户名>/.rvm/rubies/ruby-2.7.4/bin:$PATH - 验证Apache用户权限:
确保Apache运行用户(通常是apache或httpd)能读取应用目录、Gemfile.lock及RVM Gem目录:chown -R apache:apache /path/to/your/app chmod -R 755 /home/<你的用户名>/.rvm/gems/ruby-2.7.4 - 重新编译Passenger模块:
若之前安装Passenger时使用系统Ruby,重新执行:
并按照提示更新Apache配置中的rvm use 2.7.4 passenger-install-apache2-moduleLoadModule passenger_module路径。
内容的提问来源于stack exchange,提问作者John Ashmead
相关产品推荐
相关产品推荐

