2011-09-12 142 views
0

我在本地运行我的静态网站时出现了一个奇怪的问题(用于测试)。 导航到根目录时,WEBrick和Unicorn导致Rack中断言失败。不过Thin完美地运作了 。为什么这个rackup文件适用于Thin,但不适用于WEBrick或Unicorn?

我rackup文件 '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 ... 

这究竟是为什么,当所有三个服务器都应该坚持 机架规格?

回答

2

运行在Ruby 1.9的所有三个?

如果检查出机架规格(这里找到:http://rack.rubyforge.org/doc/SPEC.html)下的主体部分,它说:

身体必须对每个响应,并只能产生字符串值。 Body本身不应该是String的一个实例,因为这将在Ruby 1.9中打破。

所以根据规范我猜要么瘦正在检查它响应每或许那里有在Ruby版本的差异一个小懒虫?

+1

是的,只是包装的'File.read(index_file)'在一个数组,你会没事的。 –

+0

感谢你们俩,特别是Benoit的修复。我知道这将是简单的事情! :-)现在都在工作。 – sml

相关问题