apache, passenger/rails, ruby, redmine——rails启动/ gem路径问题.<



我有一个在apache上启动乘客的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, ...

事实上,宝石是存在的:

$ 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

和红宝石/test_user。包括有:

<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没有为乘客显示宝石的路径。

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

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

/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必须在系统范围内安装,即以root身份安装。
    它是作为redmine用户安装的,所以必须卸载。检查apache的乘客卸载页面,上面显示删除乘客文件"然后详细说明了如何做到这一点,假设乘客不是从源头安装的。
    不幸的是,我是从源代码安装的,因为常规的存储库已经过时了。从源代码卸载并不简单,因为乘客文件与其他应用程序文件混在一起,没有简单的方法可以找到它们并加以区分。最后我为用户删除了整个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,尝试为特定用户设置redmine仍然失败,出现相同的错误—Bundler找不到任何宝石。我在几个地方读到,不应该显式地设置GEM_PATH,因为Passenger/Ruby/Bundler应该能够自动找到它们需要的宝石,如果它们位于常规位置,但显然不是。我的假设是,既然redmine应用的乘客定义正确地指定了用户环境,他们应该被找到。(我不清楚这个问题是否特定于Passenger, Apache2安装或Ruby/Bundler)问题可能是因为我使用的是ruby-install而不是rvm;Passenger的文档似乎假设使用RVM作为安装程序。在任何情况下,我都必须在apache2配置中显式设置GEM_PATH。如果"gem env GEM_PATH"由用户帐户给出。因此,在本例中,在file rubies/test_user。包括上面的),添加一行:

    SetEnv GEM_PATH/home/test_user/.gem/ruby/3.0.4/:/opt/红宝石/ruby-3.0.4/lib/ruby/珠宝/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>

最新更新