【问题标题】:Rails + Faye + Apache: Moving Faye from Thin to PassengerRails + Faye + Apache:将 Faye 从 Thin 转变为 Passenger
【发布时间】:2014-06-27 12:59:54
【问题描述】:

目前正在使用我们在Passenger 上的主应用和在Thin 上的Faye 进行部署。但是我在从那个设置过渡到使用乘客的 Faye 时也遇到了一些问题。

这里 (https://github.com/faye/faye-websocket-ruby) 建议我可以在Passenger Standalone 上运行 Faye 并使用此命令启动所述服务器

passenger start -p 9292

但是,这甚至在本地都不起作用。首先它返回这个错误,说明它在

找不到 faye.js
http://localhost:9292/faye?message=%5B%7B%22channel%22%3A%22%2Fmeta%2Fhandshake%22%2C%22version%22%3A%221.0%22%2C%22supportedConnectionTypes%22%3A%5B%22callback-polling%22%5D%2C%22id%22%3A%221%22%7D%5D&jsonp=__jsonp1__

错误是这样的

Failed to load resource: the server responded with a status of 404 (Not Found) 

当您将浏览器更改为指示的位置时,它会显示

no route matches [GET] "/faye"

查看乘客日志似乎首先遇到了这个错误

Started GET "/faye" for 127.0.0.1 at 2014-05-09 10:04:23 -0700

ActionController::RoutingError (No route matches [GET] "/faye"):

然后碰到这个

Started OPTIONS "/faye" for 127.0.0.1 at 2014-05-09 10:04:58 -0700

ActionController::RoutingError (No route matches [OPTIONS] "/faye"):

在使用 Thin 运行时,我使用以下命令启动服务器

bundle exec rackup faye.ru -s thin --daemonize -E production

我正在尝试的乘客启动和瘦启动之间存在一些差异,但最大的一个是 faye.ru 永远不会运行。我的 faye.ru 是基本的

require 'faye'
faye_server = Faye::RackAdapter.new(:mount => '/faye', :timeout => 45)
Faye::WebSocket.load_adapter('thin')
run faye_server

要将其切换到Passenger,我知道我需要删除第三行......但是然后呢?当我直接将它添加到我的 config.ru 文件时,faye 服务器最终接管了整个应用程序,这绝对不是我的目标。我想也许把它放在初始化程序中会起作用,但我遇到了以下错误:

undefined method `run' for main:Object (NoMethodError)

我认为这是因为这不是 .ru 文件而是 .rb 文件。

无论如何,我发现自己很困惑,如果有任何提示/方向,我一定会很感激。

编辑:

本网站 (http://rubydoc.org/github/jamesotron/faye-rails/frames) 声明

If you want to run faye-rails on passenger, make sure you are using passenger 4.0 standalone or passenger 4.0 on nginx 1.4+ for nginx with websocket support. Passenger on apache is not supported. Because passenger uses a multi-process model, you must use the faye redis backend. Add gem 'faye-redis' to your Gemfile and configure your routes like this:

config.middleware.use FayeRails::Middleware, mount: '/faye', :timeout => 25, server: 'passenger', engine: {type: Faye::Redis, host: 'localhost'}

但是我尝试将相关代码添加到我的 application.rb 中,其中我有几个配置命令在里面进行

module App
  class Application < Rails::Application

但只需在下面添加(我的所有其他 config.whatever 是)上面建议的代码会导致此错误

uninitialized constant App::Application::FayeRails (NameError)

编辑:

添加了 faye-rails gem,因为我是个白痴(参见 cmets)。这也需要添加

config.middleware.delete Rack::Lock

因为(控制台输出)

faye-rails can't work when Rack::Lock is enabled, as it will cause
a deadlock on every request.

但是,现在我遇到了这个错误

/Users/WEF6/.rvm/gems/ruby-1.9.3-p448/gems/activesupport-4.0.1/lib/active_support/dependencies.rb:229:in `require': cannot load such file -- passenger (LoadError)

这一定与我在本文中概述的所做的一些更改有关,正如我在上面概述的那样,在本地成功启动乘客后我是如何收到错误的。现在运行乘客服务器会抛出以下错误

Could not spawn process for group location#default: An error occured while starting up the preloader.
     in 'void Passenger::ApplicationPool2::SmartSpawner::handleErrorResponse(Passenger::ApplicationPool2::SmartSpawner::StartupDetails &)' (SmartSpawner.h:455)
     in 'string Passenger::ApplicationPool2::SmartSpawner::negotiatePreloaderStartup(Passenger::ApplicationPool2::SmartSpawner::StartupDetails &)' (SmartSpawner.h:566)
     in 'void Passenger::ApplicationPool2::SmartSpawner::startPreloader()' (SmartSpawner.h:206)
     in 'virtual ProcessPtr Passenger::ApplicationPool2::SmartSpawner::spawn(const Passenger::ApplicationPool2::Options &)' (SmartSpawner.h:752)
     in 'void Passenger::ApplicationPool2::Group::spawnThreadRealMain(const SpawnerPtr &, const Passenger::ApplicationPool2::Options &, unsigned int)' (Implementation.cpp:804)

[ 2014-05-09 12:15:15.1055 71107/0x10c9ce000 agents/HelperAgent/RequestHandler.h:2222 ]: [Client 21] Cannot checkout session.
Error page:
cannot load such file -- passenger (LoadError)

【问题讨论】:

  • 您使用的是哪个乘客版本?
  • 版本 4.0.42;在本地和我的服务器上
  • faye-rails 是一个 gem,你在 gemfile 中声明 gem 'faye-rails', '~> 2.0.0' 吗?
  • 让我尴尬;我错误地认为 angular-faye-rails 包括 faye-rails 所以从未添加 gem。 掌心谢谢!
  • 我可以用我给出的方向回答这个问题吗?所以你可以接受答案...

标签: ruby-on-rails passenger faye


【解决方案1】:

你必须在你的 gemfile 中声明 faye-rails gem,包括这一行:

'faye-rails', '~> 2.0.0'

更新:

我认为您可以在application.rb 中添加以下行来解决机架锁定问题

config.middleware.delete Rack::Lock

我希望这对你有帮助。

【讨论】:

  • 您也可以将我发现的解决方案添加到中间问题中(实际上这是我建议的),但是,要明确的是,我不会接受任何答案直到完成从 Faye with Thin 到 Faye with Passenger 的总体目标。
【解决方案2】:

我注意到您在运行 Thin 时使用的是 faye.ru。 Phusion Passenger 仅支持 config.ru 作为 Rack 启动文件的文件名。也许解决方案就像将 faye.ru 重命名为 config.ru 一样简单?

【讨论】:

  • 我也想过。我的 Rails 应用程序的根目录中有一个 faye.ru 文件。但是Passenger怎么会知道呢?它不会。所以我假设它只看配置。 ru,因此为什么我在尝试连接到 faye 时得到 404 Not Found。但是我的问题是,如果你重命名文件,那么运行 Rails 应用程序本身的 config.ru 的内容呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多