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 ...
這究竟是爲什麼,當所有三個服務器都應該堅持 機架規格?
是的,只是包裝的'File.read(index_file)'在一個數組,你會沒事的。 –
感謝你們倆,特別是Benoit的修復。我知道這將是簡單的事情! :-)現在都在工作。 – sml