Mur*_*h33 3 ruby-on-rails heroku puma actioncable
我已经在本地主机环境中使用Action Cable,在这种情况下,我使用包含的简单文件启动Puma服务器
# /bin/bash
bundle exec puma -p 28080 cable/config.ru
Run Code Online (Sandbox Code Playgroud)
一旦发生这种情况,puma服务器就会启动并正在侦听此28080端口以及运行本地服务器的端口.通过在线搜索,我找不到一个地方可以告诉我在heroku上模拟这个或者让我的服务器始终在同一个端口启动的方法(虽然我不知道这是否会给我所需的结果)
我有一个javascript文件设置来创建与该端口相关的消费者.
//= require cable
//= require_self
//= require_tree .
this.App = {};
App.cable = Cable.createConsumer('ws://127.0.0.1:28080');
Run Code Online (Sandbox Code Playgroud)
我想我需要更改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'
...
Run Code Online (Sandbox Code Playgroud)
所以在我看来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
Run Code Online (Sandbox Code Playgroud)
如果有什么不清楚我会道歉,如果我遗漏了任何东西,我会很乐意提供更多信息.
编辑
以下是/app/assets/javascripts/channels/index.js.erb中的更新代码
//= require cable
//= require_self
//= require_tree .
this.App = {};
App.cable = Cable.createConsumer('<%= ENV["CABLE_SERVER"] %>');
Run Code Online (Sandbox Code Playgroud)
ENV ["CABLE_SERVER"]指向的地方ws://the-action-cable-server.herokuapp.com
.此变量存储在rails服务器env变量中.
Heroku 路由器有一些限制:它只会侦听端口80和443.换句话说,您无法在任何Heroku应用程序上打开固定端口.在ActionCable服务器的情况下,无法打开固定端口并将websocket流量路由到它.因此Heroku允许这样的事情(我怀疑)或我们使用解决方法.
从actioncable版本0.0.3开始,这是我使用的解决方法.
我们的想法是没有一个Heroku应用程序而是两个:一个用于主rails服务器,一个用于ActionCable服务器.两者都将在端口80(或443)上运行.
从一个代码库运行两个不同的服务器只需要有两个Procfiles:一个用于rails,一个用于action cable.有一个buildpack来处理这个问题.要使用它,您还需要多个buildpack.
假设你有两个Heroku应用程序叫做rails
和actioncable
.
使用以下.buildpacks
命令在项目的根目录中创建一个文件:
https://github.com/cantino/heroku-selectable-procfile
https://github.com/heroku/heroku-buildpack-ruby
Run Code Online (Sandbox Code Playgroud)
在rails
和actioncable
,创造的环境变量BUILDPACK_URL
与https://github.com/heroku/heroku-buildpack-multi.git
现在对于Procfiles,我选择继续Procfile
在本地运行一切工头并创建两个自定义的:Procfile.rails
和Procfile.actioncable
.
在Procfile.rails
,您描述除动作电缆服务器之外的所有所需动态,例如:
web: bundle exec puma -C config/puma/config.rb
clockwork: bundle exec clockwork lib/clockwork.rb
worker: bundle exec rake jobs:work
Run Code Online (Sandbox Code Playgroud)
在Procfile.actioncable
,您只描述了动作电缆服务器:
web: bundle exec puma -p $PORT cable/config.ru
Run Code Online (Sandbox Code Playgroud)
请注意,我们使用的web
dyno将在端口80(或443)上安装动作电缆服务器.
小心您需要将puma配置文件移动config/puma.rb
到自定义位置.我选择config/puma/config.rb
.config/puma.rb
是没有任何特定配置文件时启动puma的默认位置,这就是我们所拥有的Procfile.actioncable
.这可能会导致意外行为(请参阅下面的评论).
现在,上rails
,创建的环境变量PROCFILE_PATH
有Procfile.rails
和actioncable
,创造的环境变量PROCFILE_PATH
有Procfile.actioncable
.
说到env vars,actioncable
需要所有env变量rails
来启动actioncable服务器,如DATABASE_URL或任何凭据.
现在关键的一步:我们如何连接rails
和actioncable
在一起?这可以通过使用相同的 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
Run Code Online (Sandbox Code Playgroud)
最后一步是更改javascript文件,以便我们可以控制Action Cable服务器的位置.我们可以使用env var来做到这一点.
如有必要,将.js
后缀更改为.js.erb
.
//= require cable
//= require_self
//= require_tree .
this.App = {};
App.cable = Cable.createConsumer('<%= ENV["CABLE_SERVER"] %>');
Run Code Online (Sandbox Code Playgroud)
此CABLE_SERVER
变量现在可以指向ws://127.0.0.1:28080
本地和on rails
,该值将是url actioncable
.
现在,你准备在代码部署rails
和actioncable
.
actioncable
,如果您有任何客户端身份验证,您不能cookies
在示例中使用.您现在有两个Heroku应用程序,他们无法共享cookie.我想你仍然可以使用多个子域的cookie来解决这个问题.心连心
归档时间: |
|
查看次数: |
3524 次 |
最近记录: |