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

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

С тех пор я понял, что это проблема не с настройкой моего сервера, а с моим приложением rails. Я настроил это приложение на уровне сервера точно так же, как другое работающее приложение 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

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


person trobrock    schedule 30.06.2010    source источник
comment
обнаружил в этом старом билете dev.rubyonrails.org/ticket/6716 аналогичную ошибку. Есть ли у вас какие-либо инструкции включения за пределами ваших классов? Также вы проверяли имена своих классов, чтобы убедиться, что вы случайно не исправляете класс?   -  person Geoff Lanotte    schedule 01.07.2010
comment
У меня есть модель ресурсов и контроллер, может это быть причиной? Я не верю, что использую какие-либо инструкции включения.   -  person trobrock    schedule 01.07.2010
comment
Я закомментировал весь соответствующий код модели ресурсов, и это не оказало никакого влияния, я также не вижу никаких включений в моем коде.   -  person trobrock    schedule 01.07.2010
comment
Я нашел этот rails.lighthouseapp.com/projects/8994/tickets/4690 который выглядит очень похоже и приближается к исправлению с кодом в конце этого сообщения, но все еще работает некорректно. Я не знаю, чем отличается это приложение, вызывающее это. (РЕДАКТИРОВАТЬ: только что понял, что это мое единственное приложение 2.3.8, все остальные - 2.3.5)   -  person trobrock    schedule 01.07.2010
comment
Я понизил версию приложения до 2.3.5, и все работает хорошо   -  person trobrock    schedule 02.07.2010
comment
Однажды у меня была модель под названием Response, и в RSpec разразился ад ...   -  person awendt    schedule 23.05.2011
comment
Переход на более раннюю версию сработал ... но вы, вероятно, не очень хорошо себя чувствуете, если это означает, что вы застряли на этом. Начинает стареть (выпущен в 2009 году). Вы можете попробовать перейти на rails 2.3.11. Это должно быть относительно безболезненно. Однако с Rails3 дело обстоит гораздо сложнее (гораздо больше работы).   -  person Michael Durrant    schedule 26.09.2011


Ответы (3)


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

  1. Сохраните этот рубиновый код в своем приложении на config/mongrel.rb: http://gist.github.com/471663.

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

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

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

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

person rkb    schedule 17.12.2011
comment
Примерно в июне 2011 года я столкнулся с той же проблемой в приложении, использующем Rails 2.3.11, и успешно применил аналогичный обходной путь. Согласно моему коду, я получил патч от gist.github.com/826692. - person Rich Drummond; 08.08.2012
comment
@rkb Большое спасибо! Мы столкнулись с точно такой же проблемой в июне 2016 года на Rails 2.3.18. Этот обходной путь все еще действителен, за исключением того, что мы должны заменить 2.3.8 на 2.3.18 на config/mongrel.rb и добавить require File.join(File.dirname(File.expand_path(__FILE__)), 'mongrel') в config/environment.rb. Обратите внимание, что необходимы два подчеркивания вокруг FILE. - person Tsutomu; 29.06.2016

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

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

person Chris Bunch    schedule 30.06.2010

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

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

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

person Ghoti    schedule 25.05.2011