apache、passenger/rails、ruby、redmine -- rails启动/gem路径问题

apache, passenger/rails, ruby, redmine -- rails startup / gem path problem

我在 apache 上启动 passenger ruby gem 路径问题。

环境:

  ubuntu-20
  passenger-6.0.14
  ruby-3.0.4

Ruby 是使用 ruby-install 在系统范围内安装的,位于

  /opt/rubies/ruby-3.0.4

chruby 用于设置 ruby 环境。
ruby 应用程序和 gems(希望)安装在每个用户和每个应用程序的基础上。在这种情况下,redmine 是唯一的应用程序。

当我访问新创建的redmine站点时,由于gem路径问题,passenger无法启动rails:

  Raw Bundler exception:
  Bundler was unable to find one of the gems defined in the Gemfile
  Bundler tried to load the gems from #<struct Bundler::Settings::Path explicit_path=nil, system_path=false>
  Could not find rails-6.1.4.7, rouge-3.28.0, ...

gem 实际上存在:

  $ cd ~
  $ find . | grep rails-6.1.4
  ./.gem/ruby/3.0.4/specifications/rails-6.1.4.7.gemspec
  ./.gem/ruby/3.0.4/cache/rails-6.1.4.7.gem
  ./.gem/ruby/3.0.4/gems/rails-6.1.4.7
  ./.gem/ruby/3.0.4/gems/rails-6.1.4.7/README.md

虚拟主机的 apache ssl 启动看起来像:

<IfModule mod_passenger.c>
  PassengerRoot /home/test_user/.gem/ruby/3.0.4/gems/passenger-6.0.14
  PassengerDefaultRuby /opt/rubies/ruby-3.0.4/bin/ruby
</IfModule>
  ...
  Include rubies/test_user.include

和rubies/test_user.include有:

<Directory /var/www/html/issues-test>
    PassengerAppRoot /home/test_user/redmine_test
    PassengerAppEnv redmine_test
    PassengerAppGroupName redmine_test
    RailsBaseURI /issues-test
    PassengerUser test_user
    PassengerGroup test_user
    PassengerFriendlyErrorPages on
</Directory>

安装redmine的用户gem环境:

  - RUBYGEMS VERSION: 3.2.33
  - RUBY VERSION: 3.0.4 (2022-04-12 patchlevel 208) [x86_64-linux]
  - INSTALLATION DIRECTORY: /home/test_user/.gem/ruby/3.0.4
  - USER INSTALLATION DIRECTORY: /home/test_user/.gem/ruby/3.0.0
  - RUBY EXECUTABLE: /opt/rubies/ruby-3.0.4/bin/ruby
  - GIT EXECUTABLE: /usr/bin/git
  - EXECUTABLE DIRECTORY: /home/test_user/.gem/ruby/3.0.4/bin
  - SPEC CACHE DIRECTORY: /home/test_user/.local/share/gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /opt/rubies/ruby-3.0.4/etc
  - RUBYGEMS PLATFORMS:
     - ruby
     - x86_64-linux
  - GEM PATHS:
     - /home/test_user/.gem/ruby/3.0.4
     - /opt/rubies/ruby-3.0.4/lib/ruby/gems/3.0.0
  - SHELL PATH:
     - /home/test_user/.gem/ruby/3.0.4/bin
     - /opt/rubies/ruby-3.0.4/lib/ruby/gems/3.0.0/bin
     - /opt/rubies/ruby-3.0.4/bin
     - /usr/local/sbin
     - /usr/local/bin
     - /usr/sbin
     - /usr/bin
     - /sbin
     - /bin
     - /snap/bin

请注意 shell PATH 不包括

/home/test_user/.gem/ruby/3.0.4/gems/

路径;并且 test_user.include 没有为乘客显示通往 gem 的路径。

我不清楚 ruby/passenger 如何为 gem 建立路径。
乘客安装是从用户环境完成的。

注意:我也不清楚为什么安装目录显示

/home/test_user/.gem/ruby/3.0.4

但用户安装目录显示

/home/test_user/.gem/ruby/3.0.0.

(在某些时候我可能已经完成 ruby-install 3.0 并安装了 3.0.4)。但是,没有目录 ~/.gem/ruby/3.0.0

这里有几个问题。感谢@Casper 的一些提示。

  1. 必须安装 Passenger system-wide,即作为 root。
    它是作为 redmine 用户安装的,所以必须是 de-installed。 检查 passenger uninstall page for apache,它说 “删除 passenger 文件”然后详细说明如何执行此操作,假设 passenger 是从源以外的任何方式安装的。
    不幸的是,我是从源代码安装的,因为常规存储库已经过时了。从源卸载是 non-trivial,因为 passenger 文件与其他应用程序文件混合在一起,并且没有简单的方法来找到它们并加以区分。我最终为用户删除了整个 ruby / redmine 环境并重新开始。

要在 ruby-install/chruby 环境中以 root 身份安装 passenger:

sudo -i
cd /opt/rubies
source /usr/local/share/chruby/chruby.sh
chruby 3.0.4
gem install passenger
passenger-install-apache2-module
exit
  1. 一旦 passenger 在全球范围内 re-installed,尝试为特定用户设置 redmine 仍然失败并出现相同的错误 -- Bundler 找不到任何 gem。我读了几个不应该明确设置 GEM_PATH 的地方,因为 Passenger/Ruby/Bundler 应该能够自动找到他们需要的 gem 如果它们在常规位置,但显然不是。我的假设是,由于 redmine 应用程序的乘客定义正确指定了用户环境,因此应该找到它们。 (我不清楚这个问题是特定于 Passenger、Apache2 安装还是 Ruby/Bundler) 问题可能是因为我使用的是 ruby-install 而不是 rvm; passenger 的文档似乎假设 rvm 被用作安装程序。 无论如何,我必须在 apache2 配置中显式设置 GEM_PATH。 如果从用户帐户给出“gem env GEM_PATH”,则路径是显示的路径。 因此,对于这种情况,在(上面的文件 rubies/test_user.include)中,添加行:

    SetEnv GEM_PATH /home/test_user/.gem/ruby/3.0.4/:/opt/rubies/ruby-3.0.4/lib/ruby/gems/3.0.0/

完整的 apache2 配置片段如下所示:

<Directory /var/www/html/issues-test>
    PassengerAppRoot /home/test_user/redmine_test
    PassengerAppEnv redmine_test
    PassengerAppGroupName redmine_test
    RailsBaseURI /issues-test
    PassengerUser test_user
    PassengerGroup test_user
    PassengerFriendlyErrorPages on
    SetEnv GEM_PATH /home/test_user/.gem/ruby/3.0.4/:/opt/rubies/ruby-3.0.4/lib/ruby/gems/3.0.0/
</Directory>