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

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 bundler
    
    若版本不匹配,执行gem install bundler -v <Gemfile.lock中指定的版本>。
  • passenger:验证Apache模块基于Ruby 2.7.4编译:
    passenger-config about ruby-command
    
    输出的Ruby路径必须指向RVM的2.7.4版本,而非系统默认的/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
    

关键修复步骤

  1. 修正PassengerRuby配置:
    编辑Apache的Passenger配置文件(通常是/etc/httpd/conf.d/passenger.conf),设置正确的Ruby路径:
    PassengerRoot /usr/share/passenger
    PassengerRuby /home/<你的用户名>/.rvm/wrappers/ruby-2.7.4/ruby
    
  2. 添加环境变量到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
    
  3. 验证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
    
  4. 重新编译Passenger模块:
    若之前安装Passenger时使用系统Ruby,重新执行:
    rvm use 2.7.4
    passenger-install-apache2-module
    
    并按照提示更新Apache配置中的LoadModule passenger_module路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:55:22