gpt4 book ai didi

ruby-on-rails - 使用 Action Cable 将 Ruby on Rails 应用程序部署到 Heroku(Puma 端口监听)

转载 作者:行者123 更新时间:2023-12-04 05:54:11 25 4
gpt4 key购买 nike

我让 Action Cable 在本地主机环境中工作,在这种情况下,我使用一个简单的文件启动 Puma 服务器,其中包含

# /bin/bash
bundle exec puma -p 28080 cable/config.ru

一旦发生这种情况,puma 服务器就会启动并监听这个 28080 端口和本地服务器运行的端口。通过在线搜索,我找不到可以告诉我在 heroku 上进行模拟的方法或让我的服务器始终在同一端口上启动的方法(尽管我不知道这是否会给我想要的结果) )

我设置了一个 javascript 文件来创建与该端口相关的使用者。
//= require cable
//= require_self
//= require_tree .


this.App = {};

App.cable = Cable.createConsumer('ws://127.0.0.1:28080');

我想我还需要更改 127.0.0.1 部分,以便部署到 heroku 也能正常工作,但我不确定。我试图切断 28080 部分并用 ENV['PORT'] 替换它,但它说它是一个未知变量,即使我有一个 puma.rb 文件设置它的端口设置为
... (only part of the file)
rackup DefaultRackup
port ENV['PORT'] || 3000
environment ENV['RACK_ENV'] || 'development'
...

所以在我看来 ENV['PORT'] 被定义为当我检查 heroku 日志时 puma 服务器将是
2015-07-26T06:50:25.278030+00:00 heroku[web.1]: Starting process with command `bin/rails server -p 48875 -e production`
2015-07-26T06:50:30.760680+00:00 app[web.1]: => Booting Puma
2015-07-26T06:50:30.760714+00:00 app[web.1]: => Rails 4.2.1 application starting in production on http://0.0.0.0:48875
2015-07-26T06:50:30.760716+00:00 app[web.1]: => Run `rails server -h` for more startup options
2015-07-26T06:50:30.760718+00:00 app[web.1]: => Ctrl-C to shutdown server
2015-07-26T06:50:31.578843+00:00 app[web.1]: Puma 2.12.2 starting...
2015-07-26T06:50:31.578851+00:00 app[web.1]: * Min threads: 0, max threads: 16
2015-07-26T06:50:31.578859+00:00 app[web.1]: * Environment: production
2015-07-26T06:50:31.578861+00:00 app[web.1]: * Listening on tcp://0.0.0.0:48875

如果有任何不清楚的地方,我深表歉意,如果我遗漏了任何内容,我很乐意提供更多信息。

编辑

这是/app/assets/javascripts/channels/index.js.erb 中的更新代码
//= require cable
//= require_self
//= require_tree .

this.App = {};

App.cable = Cable.createConsumer('<%= ENV["CABLE_SERVER"] %>');

其中 ENV["CABLE_SERVER"] 指向 ws://the-action-cable-server.herokuapp.com 。此变量存储在 rails 服务器环境变量中。

最佳答案

问题

Heroku router 有一些限制:它只会监听端口 80 和 443。换句话说,您不能在任何 Heroku 应用程序上打开固定端口。在 ActionCable 服务器案例中,无法打开固定端口并将 websocket 流量路由到它。所以要么 Heroku 允许这样的事情(我怀疑),要么我们使用一种解决方法。

解决方法

从 actioncable 0.0.3 版开始,这里是我使用的解决方法。

这个想法不是一个 Heroku 应用程序,而是两个:一个用于主 Rails 服务器,另一个用于 ActionCable 服务器。两者都将在端口 80(或 443)上运行。

从一个代码库运行两个不同的服务器只是拥有两个 Procfiles 的问题:一个用于 rails,另一个用于 action cable。有一个 buildpack 来处理这个问题。要使用它,您还需要 multi buildpack

假设您有两个名为 railsactioncable 的 Heroku 应用程序。

使用以下命令在项目的根目录中创建一个 .buildpacks 文件:

https://github.com/cantino/heroku-selectable-procfile
https://github.com/heroku/heroku-buildpack-ruby

railsactioncable 上,使用 BUILDPACK_URL 创建一个环境变量 https://github.com/heroku/heroku-buildpack-multi.git
现在对于 Procfiles,我选择保留 Procfile 以便与 foreman 在本地运行所有内容,并创建两个自定义的: Procfile.railsProcfile.actioncable

Procfile.rails 中,您描述了所有需要的 dynos 除了 Action 电缆服务器,例如:
web: bundle exec puma -C config/puma/config.rb
clockwork: bundle exec clockwork lib/clockwork.rb
worker: bundle exec rake jobs:work

Procfile.actioncable 中,您只描述 Action 电缆服务器:
web: bundle exec puma -p $PORT cable/config.ru

请注意,我们使用的是 web dyno,它将在端口 80(或 443)上安装 Action 电缆服务器。

注意 您需要将 puma 配置文件 config/puma.rb 移动到自定义位置。我选择 config/puma/config.rbconfig/puma.rb 是在没有任何特定配置文件的情况下启动 puma 时的默认位置,这就是我们在 Procfile.actioncable 中的位置。这可能会导致意外行为(请参阅下面的评论)。

现在,在 rails 上,使用 PROCFILE_PATH 创建一个环境变量 Procfile.rails ,在 actioncable 上,使用 PROCFILE_PATH 创建一个环境变量 Procfile.actioncable

说到环境变量, actioncable 需要来自 rails 的所有环境变量,这些都是启动 actioncable 服务器所必需的,例如 DATABASE_URL 或任何凭据。

现在关键的一步:我们如何将 railsactioncable 连接在一起?这可以通过使用 相同的 Redis 实例来完成。 rails 将把消息放在 Redis 上, actioncable 将监听它们并采取相应的行动。这就是为什么两者都必须针对 相同的 Redis 实例。如果您使用 Heroku Redis,您只需要在 REDIS_URL rails 上将 actioncable 设置为相同的值。这是电缆服务器 cable.yml 的配置文件:
production: &production
:url: <%= ENV["REDIS_URL"] %>
:timeout: 1
development: &development
:url: <%= ENV["REDIS_URL"] %>
:timeout: 1
:inline: true
test: *development

最后一步是更改 javascript 文件,以便我们可以控制 Action Cable 服务器的位置。我们可以通过使用环境变量来做到这一点。

如有必要,将 .js 后缀更改为 .js.erb
//= require cable
//= require_self
//= require_tree .


this.App = {};

App.cable = Cable.createConsumer('<%= ENV["CABLE_SERVER"] %>');

这个 CABLE_SERVER 变量现在可以在本地和 ws://127.0.0.1:28080 上指向 rails ,该值将是 actioncable 的 URL。

现在您已准备好在 railsactioncable 上部署代码。

警告/缺点
  • 上的 actioncable ,如果您有任何客户端身份验证,则不能像在 examples 中那样使用 cookies 。您现在有两个 Heroku 应用程序,但它们无法共享 cookie。我想你仍然可以使用多个子域的 cookie 来 workaround
  • 您现在有两个部署目标要维护。
  • 您有多个 Procfile 需要维护。
  • 希望随着时间的推移,会有更简单的解决方法:)

  • 备择方案
  • 我们可以使用一个简单的中间件让同一台服务器处理正常的 web 流量和 websocket 流量。 Here 是怎么回事。
  • 从 rails 5 beta2 开始, Action 电缆服务器现在也可以是 side-mounted 以及您的主要 rails 应用程序。拥有两个不同的服务器仍然有意义:您可以单独扩展它们。

  • 关于ruby-on-rails - 使用 Action Cable 将 Ruby on Rails 应用程序部署到 Heroku(Puma 端口监听),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31644603/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com