Странная проблема с Rails-приложением и Mongrel

Я изначально задал вопрос, связанный с этой проблемой на serverfault.com: https://serverfault.com/info/152587/apache-mod-proxy-to-another-server

С тех пор я понял, что это не проблема с настройкой сервера, но мое приложение для рельсов. Я установил это приложение по-серверному точно так же, как и другое работающее приложение rails, которое я запускал на том же сервере. Когда я запускаю сервер, мой mongrel.log выглядит так:

** Daemonized, any open files are closed.  Look at /var/www/osuwebdev/tmp/pids/mongrel.pid and log/mongrel.log for info.
** Starting Mongrel listening at 0.0.0.0:8080
** Starting Rails with production environment...
** Rails loaded.
** Loading any Rails specific GemPlugins
** Signals ready.  TERM => stop.  USR2 => restart.  INT => stop (no restart).
** Rails signals registered.  HUP => reload (without restart).  It might not work well.
** Mongrel 1.1.5 available at 0.0.0.0:8080
** Writing PID file to /var/www/osuwebdev/tmp/pids/mongrel.pid

Когда я загружаю страницу, это появляется в журнале:

Wed Jun 30 19:46:10 +0000 2010: Error calling Dispatcher.dispatch #<NoMethodError: undefined method `[]' for nil:NilClass>
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/cgi.rb:108:in `send_cookies'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/cgi.rb:136:in `out'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/http_response.rb:65:in `start'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/cgi.rb:135:in `out'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/rails.rb:81:in `process'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:159:in `process_client'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:158:in `each'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:158:in `process_client'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:285:in `run'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:285:in `initialize'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:285:in `new'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:285:in `run'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:268:in `initialize'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:268:in `new'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:268:in `run'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/configurator.rb:282:in `run'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/configurator.rb:281:in `each'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/configurator.rb:281:in `run'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:128:in `run'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/command.rb:212:in `run'
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:281
/usr/local/bin/mongrel_rails:19:in `load'
/usr/local/bin/mongrel_rails:19

Я не могу понять, что отличается от этого приложения, которое может вызвать эту проблему.

Ответы

Ответ 1

Я считаю, что это странное сочетание ошибок в Rack, Mongrel и Rails.

  • Сохраните этот код ruby ​​в своем приложении до config/mongrel.rb: http://gist.github.com/471663

  • В вашем config/environment.rb, в самом конце файла добавьте: require File.join(File.dirname(File.expand_path(FILE)), 'mongrel')

  • В этом же файле добавьте эту строку в блок Rails:: initializer.run: config.gem "mongrel"

Более длинное объяснение проблемы здесь: https://rails.lighthouseapp.com/projects/8994/tickets/4690-mongrel-doesnt-work-with-rails-238

Это определенно сработало для приложения Rails 2.3.8, хотя я немного его погладил, чем описано выше.

Ответ 2

Вы все еще видите проблему с последующими запросами GET? У меня была аналогичная проблема, когда мое приложение Rails работало нормально под WEBrick, но не под Mongrel, но находилось где-то в интернетах (здесь ссылка, которая показывает аналогичная версия проблемы), что более старые версии Mongrel mishandle имеют первый запрос на страницу, но обрабатывают последующие запросы в порядке.

Обходной путь, который мы использовали, заключался в том, что всякий раз, когда мы запускали приложение, мы бы curl выполняли GET в приложении для "prime" Mongrel.

Ответ 3

Обычно это ошибка чтения файла yaml для config. Он настроил объект конфигурации, чтобы получать значения, и запись в файле yaml для вашей среды не существует, поэтому объект равен нулю.

Вы используете какие-либо драгоценные камни, у которых есть файл yaml, который, возможно, не настроен для разработки?

Я не знаю, почему поможет вернуться к 2.3.5 - возможно, он загружает вещи в другом порядке и доступна информация о конфигурации.