动作电缆在本地订阅,但不在 heroku 上

Posted

技术标签:

【中文标题】动作电缆在本地订阅,但不在 heroku 上【英文标题】:action cable subscribing locally, but not on heroku 【发布时间】:2017-06-11 04:07:50 【问题描述】:

我一直在尝试可以在网上找到的所有内容,但没有任何效果。希望一些新的眼睛会看到这个问题。这是我第一次使用 ActionCable,一切都在本地运行良好,但在推送到 heroku 时。我的日志没有显示任何可操作的订阅,例如我的开发服务器:

[ActionCable] [email@email.com] MsgsChannel is streaming from msg_channel_34

发送消息时,我确实看到了[ActionCable] Broadcasting to msg_channel_34:,但它们没有附加,我猜这意味着received 方法没有被访问/调用?

我注意到 heroku 的日志上写着Listening on tcp://0.0.0.0:5000,它作为开发者在 localhost:3000 监听。我应该以某种方式指向我的 heroku 应用程序吗?

以下是相关配置文件:

过程文件:

web: bundle exec puma -p 5000  ./config.ru  
actioncable: bundle exec puma -p 28080  cable/config.ru  
redis: redis-server  

***感谢下面的评论,我也在努力。仍然无法正常工作,但我可以看到它正在侦听的端口正在发生变化,让我相信它与配置有关? :

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

/cable/config.ru

require ::File.expand_path('../../config/environment',  __FILE__)  
Rails.application.eager_load!

ActionCable.server.config.allowed_request_origins = ["http://localhost:3000"]  
run ActionCable.server 

config/environments/development.rb

config.action_cable.allowed_request_origins = ['localhost:3000']
config.action_cable.url = "ws://localhost:3000/cable"

config/environments/production.rb

config.web_socket_server_url = "wss://app-name.herokuapp.com/cable" 
  config.action_cable.allowed_request_origins = ['https://app-name.herokuapp.com', 'http://app-name.herokuapp.com']

config/cable.yml

local: &local  
  adapter: async
  :url: redis://localhost:6379
  :host: localhost
  :port: 6379
  :timeout: 1
  :inline: true
development: *local  
test: *local


production:
  :url: redis:<%= ENV["REDISTOGO_URL"] %>
  adapter: redis

&lt;%= ENV["REDISTOGO_URL"] %&gt; 已设置,通过运行 heroku config 确认

routes.rb

mount ActionCable.server => '/cable'

为什么这在 dev 上有效,但在 heroku 上无效?我已经阅读了几个小时,但无法弄清楚。谢谢!!

更新: heroku 日志:

2017-01-25T20:32:57.329656+00:00 heroku[web.1]: Starting process with command `bundle exec puma -p 5000  ./config.ru`
2017-01-25T20:32:59.600554+00:00 app[web.1]: Puma starting in single mode...
2017-01-25T20:32:59.600574+00:00 app[web.1]: * Version 3.6.2 (ruby 2.3.1-p112), codename: Sleepy Sunday Serenity
2017-01-25T20:32:59.600575+00:00 app[web.1]: * Min threads: 0, max threads: 16
2017-01-25T20:32:59.600577+00:00 app[web.1]: * Environment: production
2017-01-25T20:33:02.375128+00:00 app[web.1]: profile controller
2017-01-25T20:33:02.588653+00:00 app[web.1]: Use Ctrl-C to stop
2017-01-25T20:33:02.588446+00:00 app[web.1]: * Listening on tcp://0.0.0.0:5000
2017-01-25T20:33:17.681469+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2017-01-25T20:33:17.681469+00:00 heroku[web.1]: Stopping process with SIGKILL
2017-01-25T20:33:17.862118+00:00 heroku[web.1]: Process exited with status 137
2017-01-25T20:33:57.501746+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2017-01-25T20:33:57.501908+00:00 heroku[web.1]: Stopping process with SIGKILL
2017-01-25T20:33:57.630071+00:00 heroku[web.1]: Process exited with status 137
2017-01-25T20:33:57.642753+00:00 heroku[web.1]: State changed from starting to crashed

【问题讨论】:

您找到解决方案了吗? @Codingactive 是的 - 我在下面发布了解决方案 【参考方案1】:

问题是我的主机是 heroku 应用,但请求来自自定义域。

解决:

heroku config:set RAILS_HOST "http://www.example.com"

然后在 production.rb 中:

config.action_cable.url = "wss://#ENV['RAILS_HOST']/cable"

【讨论】:

【参考方案2】:

您的 procfile 建议您在端口 28080 上使用 cable/cable.ru 运行 puma。另外 - 文件 cable/config.ru 不应包含此行:

ActionCable.server.config.allowed_request_origins = ["http://localhost:3000"]  

你已经在 config/environment/*.rb 中配置了这个

【讨论】:

我把上面那行去掉了,还是一样。我从教程中得到了我的 Procfile 中的端口 28080 - 除了 'actioncable: bundle exec puma -p 28080 cable/config.ru' 之外,它还应该说什么吗?我添加了我的 heroku 日志,以防有帮助。谢谢! :)【参考方案3】:

您的应用名称是字面意义上的app-name 吗?我怀疑不是。这些值的赔率相当不错......

config.web_socket_server_url = "wss://app-name.herokuapp.com/cable" 
config.action_cable.allowed_request_origins = ['https://app-name.herokuapp.com', 'http://app-name.herokuapp.com']

需要更新以使用您打算连接到的实际面向公众的 URL。

【讨论】:

啊,是的,我只是为了在 SO 上发帖而写的 :) 谁能告诉我config.web_socket_server_urlconfig.action_cable.url 之间的区别?哪一个用于什么目的?【参考方案4】:

我遇到了同样的问题,并找到了我需要的答案here: redis gem 4+ incompatibility "Specified 'redis' for Action Cable pubsub adapter, but the gem is not loaded"。一旦我将我的 redis 降级到 3.1.0,就可以完美运行。

【讨论】:

以上是关于动作电缆在本地订阅,但不在 heroku 上的主要内容,如果未能解决你的问题,请参考以下文章

部署到heroku后actioncable不起作用

如何更改动作电缆导轨中的 ping 间隔

让动作电缆在 Sidekiq 作业中广播

Rails 6 - 动作电缆问题

discord.js 机器人在本地工作,但不在 Heroku 上

Heroku Java 应用程序在本地崩溃但不在网络上