Nginx 上 sinatra 应用程序的机架应用程序中的 502 错误网关 error/NameError,docker 容器中的乘客

502 Bad gateway error/NameError in Rack application for sinatra app on nginx, passenger in a docker container

我从 docker (1.3.2) 开始,我试图获得一个使用 nginx、passenger 和 sinatra 的示例。 Nginx 和乘客似乎工作。但是,我没有将我的 sinatra 应用程序安装到 运行。 curl localhost 给出 502 错误网关错误 并且当我尝试在浏览器中访问时也是如此。问题是为什么会发生这种情况,这是 docker 相关还是配置问题?

如果我在 public 中放置一个 index.html 就会得到服务。如果我使用 rackup 和 curl localhost:9292 启动应用程序(见下文),我会得到预期的回复。

nginx error.log 显示:

request: "GET / HTTP/1.1", upstream: "passenger:/tmp/passenger.1.0.766/generation-0/request:", host: "localhost"
App 812 stderr: [ 2015-02-09 16:19:54.3173 828/0x00000000b759a8(Worker 1) utils.rb:84 ]: *** Exception NameError in Rack application object (uninitialized constant Rack::MethodOverride::REQUEST_METHOD) (process 828, thread 0x00000000b759a8(Worker 1)):
App 812 stderr:         from /var/lib/gems/2.1.0/gems/rack-1.6.0/lib/rack/methodoverride.rb:14:in `call'
App 812 stderr:         from /var/lib/gems/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:180:in `call'
App 812 stderr:         from /var/lib/gems/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:2014:in `call'
App 812 stderr:         from /var/lib/gems/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1478:in `block in call'
App 812 stderr:         from /var/lib/gems/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1788:in `synchronize'
App 812 stderr:         from /var/lib/gems/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1478:in `call'
App 812 stderr:         from /usr/lib/ruby/vendor_ruby/phusion_passenger/rack/thread_handler_extension.rb:74:in `process_request'
App 812 stderr:         from /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler/thread_handler.rb:141:in `accept_and_process_next_request'
App 812 stderr:         from /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler/thread_handler.rb:109:in `main_loop'
App 812 stderr:         from /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler.rb:455:in `block (3 levels) in start_threads'
2015/02/09 16:19:54 [error] 786#0: *9 upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server: localhost,

谷歌搜索错误消息我找不到任何有用的信息。我还尝试设置此处描述的示例:https://www.linode.com/docs/websites/frameworks/sinatra-framework-and-nginx-on-debian-6-squeeze 结果与上面相同。

我的目录结构:
/home/app/sinatra-test/config.ru
/home/app/sinatra-test/app.rb
/home/app/sinatra-test/public/
/etc/nginx/sites-enabled/sinatra-test

config.ru:

require 'rubygems'
require './app'
run Sinatra::Application

app.rb:

require 'sinatra'

get '/' do
  "Hello from Sinatra!"
end

sinatra-test 中的 nginx 配置:

server {
  server_name localhost;
  listen 80;
  root /home/app/sinatra-test/public;

  passenger_enabled on;
  passenger_user app;
  passenger_ruby /usr/bin/ruby2.1;
}

进一步阅读导致此 http://blog.baroquebobcat.com/category/tech/ 指出了答案 - 安装的机架版本与 one sinatra 要求不匹配。我使用的是包含机架 1.6.0 的 phusion passenger docker 图像。降级到 1.4.0 解决了这个问题。

我是Phusion Passenger 的作者。我们最近收到了另一位遇到同样问题的用户的问题。问题的原因与 ikkjo 描述的差不多。解决方案是使用 Gemfile。

我们已在 Passenger Github 问题跟踪器上记录了该问题及其解决方案:https://github.com/phusion/passenger/issues/1478#issuecomment-93730487