如何整理Ruby,Passenger和Rack的多个版本(在Apache下)

时间:2018-05-16 09:39:25

标签: ruby apache rubygems passenger bundler

我有一个经典的" monolith"服务器在Passenger下运行多个Ruby应用程序。根据乘客文件,这应该可以正常工作,但我发现了一些我需要帮助解决的问题。

文档说明:

  

Passenger可以与任何Ruby解释器一起安装。安装完毕后   你可以在任何Ruby解释器下运行Passenger的Ruby部件   想要,即使那个Ruby解释器不是你原来的那个   安装乘客。

     

[---]

     

Passenger还能够在任何情况下运行Ruby Web应用程序   你想要的Ruby解释器。因此,使用哪个Ruby并不重要   安装乘客:无论如何都会工作。请参考   passenger_ruby指令的文档,以了解如何运行   不同的Ruby解释器下的不同Web应用程序。

我使用SLES发行版的官方软件包安装了Passenger和Apache模块。它是一个相当旧的版本(5.0.18),但由于仍然保持分发,因此修补它以修复任何已知的安全漏洞。当然,这个Passenger安装在Ruby系统下。

我还安装了多个其他Rubies。如果我使用PassengerRuby指令指向全新安装,它会抱怨未找到乘客。我已经意识到我需要在每个Ruby解释器下安装Passenger才能启动应用程序。 (我没有在文档中看到过这种情况。)但这会带来一个问题。在我的新Ruby下安装Passenger时,我直接使用rubygems,而不是RPM。我可以尝试选择与RPM(5.0.18)相同的版本,但它将是一个非修补版本。我也可以让gem命令选择最新的(修补最多的)版本,但是应用程序不会启动:

App 21959 stderr: /opt/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/passenger-5.3.0/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb:941:in `try_write_file': undefined method `try_write_file' for #<Hash:0x0000560031e58c88> (NoMethodError)
App 21959 stderr:   from /opt/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/passenger-5.3.0/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb:522:in `dump_envvars'
App 21959 stderr:   from /opt/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/passenger-5.3.0/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb:464:in `dump_all_information'
App 21959 stderr:   from /opt/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/passenger-5.3.0/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb:394:in `about_to_abort'
App 21959 stderr:   from /usr/lib64/passenger/5.0.18//helper-scripts/rack-preloader.rb:89:in `rescue in init_passenger'
App 21959 stderr:   from /usr/lib64/passenger/5.0.18//helper-scripts/rack-preloader.rb:72:in `init_passenger'
App 21959 stderr:   from /usr/lib64/passenger/5.0.18//helper-scripts/rack-preloader.rb:152:in `<module:App>'
App 21959 stderr:   from /usr/lib64/passenger/5.0.18//helper-scripts/rack-preloader.rb:29:in `<module:PhusionPassenger>'
App 21959 stderr:   from /usr/lib64/passenger/5.0.18//helper-scripts/rack-preloader.rb:28:in `<main>'

它看起来像是&#34; main&#34;的帮助脚本。乘客挂钩进入较新的乘客。我猜这个错误是因为som API可能已经改变了?

所以这是我的第一个问题 - 安装的Passenger是否要求每个使用过的Ruby解释器让它自己安装相同版本的Passenger?你怎么处理这个?

现在让我们说我已经解决了第一步并安装了兼容的乘客。然后我尝试再次启动应用程序:

App 1407 stdout: 
[ 2018-05-15 21:34:57.4890 1367/7f1eda77b700 App/Implementation.cpp:303 ]: Could not spawn process for application /myApp: An error occured while starting up the preloader.
  Error ID: 5a8f172f
  Error details saved to: /var/run/passenger/passenger-error-XwWBnN.html
  Message from application: You have already activated rack 2.0.5, but your Gemfile requires rack 2.0.3. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)

事实证明,Passenger本身依赖于Rack。宝石吸入了最新版本,即Rack 2.0.5。 Passenger加载此版本,然后执行Bundler设置。但该应用程序已锁定到2.0.3版。将bundle exec添加到PassengerRuby指令并不能解决它,因为然后Passenger本身不可用 - 除非我将它添加到Gemfile中,文档quite clearly states不应该是必需的。

所以我可以同步这些版本,但是我需要在特定Ruby解释器下的所有应用程序之间同步Rack版本。这大大降低了捆绑器的好处,它旨在解决这类问题。或者我需要将我的应用程序耦合到当前的部署方法。解决这个问题的最佳(最不好)方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以使用RVM吗?它应该可以帮助您管理几种红宝石和宝石。

在我的系统中,我注意到一个乘客模块就足够了,就像文档中所说的那样。我用gem install passenger将它安装在了一个空的gemset中。

我注意到的一个令人困惑的事情是,每个VirtualHost的PassengerRuby指令(对于Apache)应该指向每个应用程序的gemset,而不是 not 指向Passenger模块所在的gemset已安装,也没有安装到任何常规(匿名)gemset。否则,您将获得大量重叠的宝石集。 PassengerRuby中提到的红宝石版本不需要与“乘客”的编译版本相同。我的CentOS安装示例:

PassengerRuby /usr/local/rvm/gems/ruby-2.4.2@gemset-of-my-app/wrappers/ruby