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 的一些提示。
- 必须安装 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
一旦 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>
我在 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 的一些提示。
- 必须安装 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
一旦 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>