我有一个经典的" 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版本。这大大降低了捆绑器的好处,它旨在解决这类问题。或者我需要将我的应用程序耦合到当前的部署方法。解决这个问题的最佳(最不好)方法是什么?
答案 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