2011-09-12 7 views
0

내 정적 웹 사이트를 로컬로 (테스트 용으로) 실행하는 데 이상한 문제가 있습니다. 루트로 탐색 할 때 WEBrick과 Unicorn이 모두 Rack에서 어설 션 오류의 원인이됩니다. 그러나 얇은 작품은 완벽하게 입니다.왜이 랙 파일은 WEBrick이나 Unicorn이 아닌 Thin에서 작동합니까?

내 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 ... 

3 대의 서버가 모두 랙 사양을 준수해야하는 이유는 무엇입니까?

답변

2

세 가지 모두가 루비 1.9에서 실행 중입니까? 그것이 말하는 몸 섹션에서 : 당신이 (http://rack.rubyforge.org/doc/SPEC.html 여기) : 랙 사양을 선택하면

은 신체 각에 응답해야하며 문자열 값을 산출해야합니다. Body 자체는 String의 인스턴스가 아니어야합니다. Ruby 1.9에서 깨질 것입니다.

그래서 스펙에 따르면 나는 얇은 것 같아요. 각자 또는 아마도 루비 버전의 차이점을 확인하는 데 조금은 불만이 있습니까?

+1

그래,'File.read (index_file)'을 배열로 감싸면 괜찮을 것이다. –

+0

두 분 모두에게 감사드립니다. 특히 Benoit에게 고맙습니다. 나는 그게 뭔가 간단 할 줄 알았어! :-) 지금 일하고 있습니다. – sml