为什么这个rackup文件适用于Thin,而不适用于WEBrick或Unicorn?

时间:2011-09-12 15:07:39

标签: ruby rack thin webrick unicorn

我在本地运行静态网站时有一个奇怪的问题(用于测试)。 当导航到root时,WEBrick和Unicorn都会导致Rack中的断言失败。然而瘦作品 完美。

我的机架文件'config.ru':

# This is the root of our app
@root = File.expand_path(File.dirname(__FILE__)) + '/site'
default_charset = "; charset=UTF-8"

run Proc.new { |env|

    # Extract the requested path from the request
    path = Rack::Utils.unescape(env['PATH_INFO'])
    index_file = @root + "#{path}/index.html"

    if File.exists?(index_file)
        # Return the index
        [200, {'Content-Type' => 'text/html' + default_charset}, File.read(index_file)]
    else
        # Pass the request to the directory app
        response = Rack::Directory.new(@root).call(env)
        if response[1]['Content-Type']
            response[1]['Content-Type'] += default_charset
        end
        response
    end
}

宝石清单如下:

$ bundle exec gem list

*** LOCAL GEMS ***

bundler (1.0.18)
coderay (0.9.8)
daemons (1.1.4)
erector (0.8.3)
eventmachine (0.12.10)
kgio (2.6.0)
kramdown (0.13.3)
polyglot (0.3.2)
rack (1.3.2)
raindrops (0.7.0)
rake (0.9.2)
thin (1.2.11)
treetop (1.4.10)
unicorn (4.1.1)

这些是我得到的错误:

$ bundle exec rackup
[2011-09-12 21:19:50] INFO  WEBrick 1.3.1
[2011-09-12 21:19:50] INFO  ruby 1.9.2 (2010-08-18) [x86_64-linux]
[2011-09-12 21:19:50] INFO  WEBrick::HTTPServer#start: pid=2556 port=9292
127.0.0.1 - - [12/Sep/2011 21:20:05] "GET / HTTP/1.1" 200 - 0.0027
[2011-09-12 21:20:05] ERROR Rack::Lint::LintError: Response body must respond to each
        /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/lint.rb:19:in `assert'
        /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/lint.rb:513:in `each'
        /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/body_proxy.rb:26:in `method_missing'
        /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/chunked.rb:23:in `each'
        /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/handler/webrick.rb:71:in `service'
        /usr/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service'
        /usr/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run'
        /usr/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread'

$ bundle exec unicorn
I, [2011-09-12T21:20:33.219694 #2567]  INFO -- : listening on addr=0.0.0.0:8080 fd=3
I, [2011-09-12T21:20:33.219883 #2567]  INFO -- : worker=0 spawning...
I, [2011-09-12T21:20:33.220771 #2567]  INFO -- : master process ready
I, [2011-09-12T21:20:33.221535 #2570]  INFO -- : worker=0 spawned pid=2570
I, [2011-09-12T21:20:33.221787 #2570]  INFO -- : Refreshing Gem list
I, [2011-09-12T21:20:33.253184 #2570]  INFO -- : worker=0 ready
127.0.0.1 - - [12/Sep/2011 21:20:41] "GET / HTTP/1.1" 200 - 0.0030
E, [2011-09-12T21:20:41.087884 #2570] ERROR -- : app error: Response body must respond to each (Rack::Lint::LintError)
E, [2011-09-12T21:20:41.087935 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/lint.rb:19:in `assert'
E, [2011-09-12T21:20:41.087968 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/lint.rb:513:in `each'
E, [2011-09-12T21:20:41.087991 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/body_proxy.rb:26:in `method_missing'
E, [2011-09-12T21:20:41.088013 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/chunked.rb:23:in `each'
E, [2011-09-12T21:20:41.088035 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/unicorn-4.1.1/lib/unicorn/http_response.rb:41:in `http_response_write'
E, [2011-09-12T21:20:41.088057 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/unicorn-4.1.1/lib/unicorn/http_server.rb:536:in `process_client'
E, [2011-09-12T21:20:41.088078 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/unicorn-4.1.1/lib/unicorn/http_server.rb:600:in `worker_loop'
E, [2011-09-12T21:20:41.088100 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/unicorn-4.1.1/lib/unicorn/http_server.rb:485:in `spawn_missing_workers'
E, [2011-09-12T21:20:41.088124 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/unicorn-4.1.1/lib/unicorn/http_server.rb:135:in `start'
E, [2011-09-12T21:20:41.088147 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/gems/unicorn-4.1.1/bin/unicorn:121:in `<top (required)>'
E, [2011-09-12T21:20:41.088168 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/bin/unicorn:19:in `load'
E, [2011-09-12T21:20:41.088190 #2570] ERROR -- : /home/scott/development/test/bundle/ruby/1.9.1/bin/unicorn:19:in `<main>'

精瘦工作:

$bundle exec thin start
>> Using rack adapter
>> Thin web server (v1.2.11 codename Bat-Shit Crazy)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:3000, CTRL+C to stop
^C>> Stopping ...

为什么会发生这种情况,当所有三台服务器都应该遵守时 机架规格?

1 个答案:

答案 0 :(得分:2)

所有三个都在ruby 1.9上运行吗?

如果你看看机身部分下面的机架规格(见http://rack.rubyforge.org/doc/SPEC.html),它会说:

Body必须响应每个,并且必须只生成String值。 Body本身不应该是String的实例,因为这将在Ruby 1.9中破坏。

所以根据规范,我认为瘦身是一个有点松懈的检查它对每个或许可能红宝石版本的差异?