【发布时间】:2018-10-26 07:11:43
【问题描述】:
我有一个经典的“单体”服务器,在Passenger 下运行多个Ruby 应用程序。根据乘客文档,这应该可以正常工作,但我发现了一些需要帮助解决的问题。
文档说明:
Passenger 可以与任何 Ruby 解释器一起安装。安装后, 您可以在任何 Ruby 解释器下运行 Passenger 的 Ruby 部分 想要,即使那个 Ruby 解释器不是你最初的那个 安装了Passenger。
[---]
Passenger 还能够在任何环境下运行 Ruby Web 应用程序 你想要的 Ruby 解释器。所以使用哪个 Ruby 并不重要 安装Passenger:无论如何它都会工作。请参考 乘客红宝石指令的文档以了解如何运行 不同的 Ruby 解释器下的不同 Web 应用程序。
我已经使用官方软件包为我的 SLES 分发安装了 Passenger 和 Apache 模块。它是一个相当旧的版本(5.0.18),但由于分发版仍在维护,它已被修补以修复任何已知的安全漏洞。这个Passenger当然是安装在Ruby系统下的。
我还安装了多个其他红宝石。如果我使用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>'
它看起来像是一个从“主”Passenger 挂钩到新的Passenger 的辅助脚本。我猜这个错误是因为 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。 gem 吸收了最新版本,即 Rack 2.0.5。乘客加载此版本,然后执行 Bundler 设置。但是应用程序被锁定到 2.0.3 版本。将 bundle exec 附加到PassengerRuby 指令并不能解决它,因为那时Passenger 本身将不可用-除非我将它添加到Gemfile,文档quite clearly states 不应该是必需的。
所以我可以同步这些版本,但是我需要在特定的 Ruby 解释器下跨所有应用程序同步 Rack 版本。这大大降低了 bundler 的好处,本来就是为了解决这类问题。或者我需要将我的应用程序耦合到当前的部署方法。解决此问题的最佳(最差)方法是什么?
【问题讨论】:
标签: ruby apache rubygems passenger bundler