Rails 应用程序和 Mongrel 的奇怪问题

Posted

技术标签:

【中文标题】Rails 应用程序和 Mongrel 的奇怪问题【英文标题】:Weird problem with Rails app and Mongrel 【发布时间】:2011-03-10 08:04:04 【问题描述】:

我最初在 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

我不知道这个应用程序有什么不同可能导致这个问题。

【问题讨论】:

发现这张旧票dev.rubyonrails.org/ticket/6716 类似错误。您的课程之外是否有任何包含语句?您是否还检查了您的班级名称,以确保您不会无意中给班级打补丁? 我确实有一个“资源”模型和控制器,这可能是导致它的原因吗?我不相信我在使用任何包含语句。 我将所有与“资源”模型相关的代码都注释掉了,它没有任何效果,我的代码中也没有看到任何包含。 我确实发现了这个rails.lighthouseapp.com/projects/8994/tickets/4690,它看起来非常相似,并且接近于使用该帖子末尾的代码进行修复,但仍然无法正常工作。我不知道导致此问题的此应用程序有什么不同。 (编辑:刚刚意识到这是我唯一的 2.3.8 应用程序,所有其他应用程序都是 2.3.5) 我将应用程序降级到 2.3.5 并且一切正常 【参考方案1】:

您在后续的 GET 请求中仍然看到问题吗?我有一个类似的问题,我的 Rails 应用程序可以在 WEBrick 下运行良好,但不能在 Mongrel 下运行,但在 Internet 上的某处发现(here's a link 显示了类似版本的问题)旧版本的 Mongrel 错误处理了对页面的第一个请求,但是处理后续请求ok。

我们采用的解决方法是,每当我们启动应用程序时,我们都会让 curl 在应用程序上执行 GET 以“启动”Mongrel。

【讨论】:

【参考方案2】:

通常是读取配置文件的 yaml 文件失败。它设置了一个配置对象以从中获取值,并且您的环境的 yaml 文件中的条目不存在,因此该对象为零。

您是否正在运行任何具有 yaml 文件但可能未设置用于开发的 gem?

我不知道为什么回到 2.3.5 会有所帮助 - 可能是它以不同的顺序加载内容并且配置信息可用。

【讨论】:

【参考方案3】:

我认为这是 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 应用程序,尽管我对它的修补与上面描述的略有不同。

【讨论】:

我在 2011 年 6 月左右的某个时候在使用 Rails 2.3.11 的应用程序中遇到了同样的问题,并成功应用了类似的解决方法。根据我的代码,我从gist.github.com/826692获得了补丁。 @rkb 非常感谢!我们在 2016 年 6 月在 Rails 2.3.18 上遇到了完全相同的问题。这个解决方法仍然有效,除了我们必须在config/mongrel.rb 上将2.3.8 更改为2.3.18 并将require File.join(File.dirname(File.expand_path(__FILE__)), 'mongrel') 添加到config/environment.rb。请注意,FILE 周围需要两个下划线。

以上是关于Rails 应用程序和 Mongrel 的奇怪问题的主要内容,如果未能解决你的问题,请参考以下文章

带有 RVM 的 Rails mongrel 无法启动 - mongrel_rails (MissingSourceFile)

何时使用 Mongrel 作为 Rails 应用程序的 Web 服务器?

我应该为我的 Rails 应用程序使用 Apache 还是 Nginx &Passenger 或 Mongrel

减少 Mongrel Rails 内存占用并提高性能?

Nginx 和 Mongrel 的区别?

使用 Mongrel 在 Windows 上运行 Ruby On Rails