【问题标题】:Problems with Passenger on ApacheApache 上的乘客问题
【发布时间】:2014-06-16 09:16:30
【问题描述】:

在Passenger Apache 版本上使用rack-http-logger 中间件部署机架应用程序时遇到问题。问题是 Apache 不接受该中间件正在解释的 LOG 方法请求,因此我尝试改用 POST。

这是我的 config.ru:

require 'bundler'
Bundler.require

$stdout.sync = true

use Rack::HTTPLogger, :method => 'POST'
run lambda { [404, {'Content-Type' => 'text/html'}, ['Page Not Found']] }

在 Thin 上一切正常,但在 Passenger 上出现此错误:

App 57235 stderr: [ 2014-04-30 08:30:05.9440 57256/0x007ffe8c018af0(Worker 1) utils.rb:68 ]: 
*** Exception ArgumentError in Rack application object (wrong number of arguments (1 for 0)) (process 57256, thread 0x007ffe8c018af0(Worker 1)):
App 57235 stderr:   from config.ru:7:in `block (2 levels) in <main>'
App 57235 stderr:   from /Users/apps/.rvm/gems/ruby-1.9.3-p545/gems/rack-http-logger-0.1.0/lib/rack/http-logger.rb:17:in `call'
App 57235 stderr:   from /Users/apps/.rvm/gems/ruby-1.9.3-p545/gems/rack-http-logger-0.1.0/lib/rack/http-logger.rb:17:in `call'
App 57235 stderr:   from /Users/apps/.rvm/gems/ruby-1.9.3-p545/gems/passenger-4.0.41/lib/phusion_passenger/rack/thread_handler_extension.rb:74:in `process_request'
App 57235 stderr:   from /Users/apps/.rvm/gems/ruby-1.9.3-p545/gems/passenger-4.0.41/lib/phusion_passenger/request_handler/thread_handler.rb:141:in `accept_and_process_next_request'
App 57235 stderr:   from /Users/apps/.rvm/gems/ruby-1.9.3-p545/gems/passenger-4.0.41/lib/phusion_passenger/request_handler/thread_handler.rb:109:in `main_loop'
App 57235 stderr:   from /Users/apps/.rvm/gems/ruby-1.9.3-p545/gems/passenger-4.0.41/lib/phusion_passenger/request_handler.rb:448:in `block (3 levels) in start_threads'
[Wed Apr 30 08:30:05 2014] [error] [client 172.20.16.168] Premature end of script headers: 

有什么我可能做错的想法吗?

【问题讨论】:

  • 您是否调查过“机架应用程序对象中的异常 ArgumentError(参数数量错误(1 对 0))”?
  • 是的,问题是这段代码在 Thin 和 Foreman 下工作,这就是让我认为这可能是乘客问题的原因。
  • 听起来我们对调查的定义非常不同......那个无效的论点是什么,它是如何/为什么被设置的?
  • 我猜:method =&gt; 'POST' 传递错误?但是 rack-http-logger 文档说这是一个有效的选择。
  • 不,不,不:不是猜测。深入研究 Rake 和/或Passenger 和/或其他代码,并使用ppp 直接从代码中识别什么 正在传递。然后使用caller 确定它通过的原因。

标签: ruby apache passenger rack middleware


【解决方案1】:

您的应用程序对象(您传递给run 的lambda)不符合the Rack specification。根据规范,它必须只接受 1 个参数,但您的 lambda 不接受任何参数,因此您会收到 ArgumentError。

Phusion Passenger 实现 Rack 的方式与 Thin 不同。因为 Rack 规范没有指定如何处理规范冲突,所以每个服务器处理它的方式不同。这就是为什么一些在 Thin 上有效的(错误)代码可能在 Phusion Passenger 上无效的原因,反之亦然。

【讨论】:

  • 我现在明白了,这显然是我的错误。非常感谢。
猜你喜欢
  • 2011-04-29
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 2016-07-12
  • 2018-01-15
  • 1970-01-01
  • 2011-09-13
相关资源
最近更新 更多