0

我正在尝试设置 Apache/Passenger 配置以允许多个 Ruby 版本。我在这里看到了关于多个红宝石的帖子(http://blog.phusion.nl/2013/08/19/phusion-passenger-4-0-14-released/)但显然它已经过时了,因为Passenger现在支持“PassengerRuby”在虚拟主机中配置。但是,我仍然遇到麻烦。我究竟做错了什么?

我安装了配置为的乘客(4.0.14)

PassengerDefaultRuby /usr/local/rvm/rubies/ree-1.8.7-2012.02/bin/ruby

服务器有一个最近升级的虚拟主机,包含一些仅在最新版本的 Rails 中可用的功能。所以我试图为该应用程序运行 Ruby 1.9.3 和 Rails 3.0。

编辑:该应用程序需要 1.9.3 才能获得某些特定功能。但是当我只使用作为 1.8.7 的 PassengerDefaultRuby 运行它时,它工作正常(除了那些功能)。只有当我添加 1.9.3 时我才会遇到问题。

编辑:如果我将 1.9.3 指定为默认 Ruby,并且不为应用程序指定 PassengerRuby,则该应用程序将无法运行。所以我猜我的 1.9.3 安装有问题。

所以..我加

PassengerRuby /usr/local/rvm/rubies/ruby-1.9.3-p448/bin/ruby

当我这样做时,我在 apache2 error.log 中得到以下堆栈跟踪

[ 2013-09-06 07:48:32.2794 32582/7f4d0715c700 Pool2/Spawner.h:738 ]: [App 32622 stdout] 
[ 2013-09-06 07:48:35.6479 32582/7f4d0711b700 Pool2/Implementation.cpp:1172 ]: [App 32622 stderr] [     2013-09-06 07:48:35.6477 32622/0x00000002c633e0(Worker 1) utils.rb:71 ]: *** Exception TypeError in Passenger RequestHandler's client socket (wrong argument type Array (expected Struct)) (process 32622, thread 0x00000002c633e0(Worker 1)):
[ 2013-09-06 07:48:35.6479 32582/7f4d0711b700 Pool2/Implementation.cpp:1172 ]: [App 32622 stderr]   from /usr/lib/ruby/gems/1.8/gems/passenger-4.0.14/lib/phusion_passenger/ruby_core_enhancements.rb:81:in `writev2'
[ 2013-09-06 07:48:35.6479 32582/7f4d0711b700 Pool2/Implementation.cpp:1172 ]: [App 32622 stderr]   from /usr/lib/ruby/gems/1.8/gems/passenger-4.0.14/lib/phusion_passenger/ruby_core_enhancements.rb:81:in `writev2'
[ 2013-09-06 07:48:35.6479 32582/7f4d0711b700 Pool2/Implementation.cpp:1172 ]: [App 32622 stderr]   from /usr/lib/ruby/gems/1.8/gems/passenger-4.0.14/lib/phusion_passenger/utils/unseekable_socket.rb:126:in `writev2'
[ 2013-09-06 07:48:35.6479 32582/7f4d0711b700 Pool2/Implementation.cpp:1172 ]: [App 32622 stderr]   from /usr/lib/ruby/gems/1.8/gems/passenger-4.0.14/lib/phusion_passenger/rack/thread_handler_extension.rb:130:in `process_request'
[ 2013-09-06 07:48:35.6480 32582/7f4d0711b700 Pool2/Implementation.cpp:1172 ]: [App 32622 stderr]   from /usr/lib/ruby/gems/1.8/gems/passenger-4.0.14/lib/phusion_passenger/request_handler/thread_handler.rb:140:in `accept_and_process_next_request'
[ 2013-09-06 07:48:35.6480 32582/7f4d0711b700 Pool2/Implementation.cpp:1172 ]: [App 32622 stderr]   from /usr/lib/ruby/gems/1.8/gems/passenger-4.0.14/lib/phusion_passenger/request_handler/thread_handler.rb:108:in `main_loop'
[ 2013-09-06 07:48:35.6480 32582/7f4d0711b700 Pool2/Implementation.cpp:1172 ]: [App 32622 stderr]   from /usr/lib/ruby/gems/1.8/gems/passenger-4.0.14/lib/phusion_passenger/request_handler.rb:441:in `block (3 levels) in start_threads'
[Fri Sep 06 07:48:35 2013] [error] [client 10.100.193.133] Premature end of script headers:
4

2 回答 2

1

我在 phusion-passenger 电子邮件列表中收到了来自 Phusion 的以下回复。

>Passenger RequestHandler 的客户端套接字中的异常类型错误(错误的参数类型数组(预期的结构))(进程 32622,线程 0x00000002c633e0(工人 1)):

此错误表明您的 Ruby 解释器正在加载本机
为不同的 Ruby 版本编译的扩展。尝试清洁
事情了:

sudo rm -rf /usr/lib/ruby/gems/1.8/gems/passenger-4.0.14/buildout/ruby
rm -rf ~/.passenger/native_support

然后重新启动您的网络服务器并重新访问您的应用程序。这有帮助吗?

由于我是作为 sudo 安装的,所以我没有 ~/.passenger 目录。但是删除 buildout/ruby 目录就足以让我的 1.9.3 应用程序运行。

于 2013-09-09T14:43:13.637 回答
0

我最近使用不同版本的 Ruby(1.9.3 和 2.0.0)实现了 Passenger 4.0.10。以下是一些需要检查的事项:

您是否在每个 RVM gemset 中安装了Passenger gem?当我遇到问题时,乘客团队建议我这样做。

您是否在文档中查看了针对 PassengerRuby的RVM 帮助工具?这是来自Passenger的PassengerRoot文档的链接。您可能对PassengerRuby 有错误的值。您将需要在每个 gemset 中执行which Passenger-config命令以获得正确的命令来执行乘客配置。在passenger-config --ruby-command的输出中有两个部分提到PassengerRuby 的值。我在虚拟主机配置文件的输出中使用了第一部分中提到的值。

注意:有时 RVM 对我来说可能是一场噩梦 :) 在让它工作之前,我不得不多次查看 RVM Helper Tool 文档(以及几次失败的尝试)。

于 2013-09-06T15:17:20.510 回答