2011-09-12 106 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

相關問題