3

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');

herokuへのデプロイも機能させるには、127.0.0.1の部分も変更する必要があると思いますが、よくわかりません。28080 の部分を切り取り、それを ENV['PORT'] に置き換えようとしましたが、ポートが

... (only part of the file)
rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || 'development'
...

したがって、herokuログを確認すると、ENV ['PORT']が定義されているように見えました。

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 サーバーの環境変数に格納されます。

4

1 に答える 1

9

問題

Herokuルーターにはいくつかの制限があります。ポート 80 と 443 のみをリッスンします。つまり、Heroku アプリケーションで固定ポートを開くことはできません。ActionCable サーバーの場合、固定ポートを開いて Websocket トラフィックをそこにルーティングする方法はありません。したがって、Heroku がそのようなことを許可するか (私には疑わしい)、回避策を使用するかのいずれかです。

回避策

actioncable のバージョン 0.0.3 の時点で、私が使用した回避策は次のとおりです。

Heroku アプリケーションを 1 つではなく 2 つ (1 つはメインの Rails サーバー用、もう 1 つは ActionCable サーバー用) にするという考え方です。どちらもポート 80 (または 443) で実行されます。

1 つのコードベースから 2 つの異なるサーバーを実行するには、レール用とアクション ケーブル用の 2 つの Procfile を用意するだけです。これを処理するビルドパックがあります。これを使用するには、 multi buildpackも必要です。

と という名前の 2 つの Heroku アプリケーションがあるとrailsactioncableます。

.buildpacksこれを使用して、プロジェクトのルートにファイルを作成します。

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

railsとで、環境変数をactioncable作成しますBUILDPACK_URLhttps://github.com/heroku/heroku-buildpack-multi.git

Procfiles については、Procfileすべてを foreman でローカルに実行することを選択し、2 つのカスタム ファイルを作成します:Procfile.railsProcfile.actioncable.

では、アクション ケーブル サーバーを除くProcfile.railsすべての必要な dyno を記述します。例:

web: bundle exec puma -C config/puma/config.rb
clockwork: bundle exec clockwork lib/clockwork.rb
worker: bundle exec rake jobs:work

では、アクション ケーブル サーバのみProcfile.actioncableを説明します。

web: bundle exec puma -p $PORT cable/config.ru

webアクション ケーブル サーバーをポート 80 (または 443) にマウントする dyno を使用していることに注意してください。

注意config/puma.rbpuma 構成ファイルをカスタムの場所に移動する必要があります。を選びますconfig/puma/config.rbconfig/puma.rbは、特定の構成ファイルなしで puma を起動したときのデフォルトの場所です。これは、Procfile.actioncable. これにより、予期しない動作が発生する可能性があります (以下のコメントを参照してください)。

次に、 onrailsで環境変数を作成PROCFILE_PATHProcfile.rails、 onactioncableで環境変数を作成PROCFILE_PATHProcfile.actioncableます。

環境変数といえば、DATABASE_URL や資格情報などの actioncable サーバーを起動するために必要actioncableなすべての環境変数が必要です。rails

重要なステップは次のとおりrailsですactioncableこれは、同じRedis インスタンスを使用して簡単に実行できます。railsRedis にメッセージを置きactioncable、それらをリッスンしてそれに応じて行動します。そのため、両方が同じRedis インスタンスをターゲットにする必要があります。Heroku Redis を使用している場合は、とREDIS_URLに同じ値を設定するだけです。ケーブル サーバの設定ファイルは次のとおりです。rails actioncablecable.yml

production: &production
  :url: <%= ENV["REDIS_URL"] %>
  :timeout: 1
development: &development
  :url: <%= ENV["REDIS_URL"] %>
  :timeout: 1
  :inline: true
test: *development

最後のステップは、JavaScript ファイルを変更して、Action Cable サーバーの場所を制御できるようにすることです。env var を使用してこれを行うことができます。

.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ローカルおよび on を指すことができるようになりました。rails値は の URL になりactioncableます。

railsこれで、コードをおよびにデプロイする準備が整いましたactioncable

警告/欠点

  • on 、クライアント認証がある場合、のようにactioncable使用できません。2 つの Heroku アプリがあり、Cookie を共有できません。複数のサブドメインの Cookie を使用して、これを回避できると思います。cookies
  • これで、維持するデプロイ ターゲットが 2 つになりました。
  • 維持するプロファイルが複数ある場合。
  • うまくいけば、時間の経過とともに、より簡単な回避策が見つかるでしょう:)

代替案

  • シンプルなミドルウェアを使用して、同じサーバーで通常の Web トラフィックWebsocket トラフィックを処理できます。方法は次のとおりです。
  • Rails 5 beta2 の時点で、アクション ケーブル サーバーをメインの Rails アプリと一緒にサイド マウントできるようになりました。2 つの異なるサーバーを使用することは依然として理にかなっています。それらを個別にスケーリングできます。

h番目

于 2015-07-28T12:48:50.867 に答える