【问题标题】:NGINX configuration for Rails 5 ActionCable with puma带有 puma 的 Rails 5 ActionCable 的 NGINX 配置
【发布时间】:2016-04-13 08:37:51
【问题描述】:

我将 Jelastic 用于我的开发环境(尚未投入生产)。 我的应用程序使用 Unicorn 运行,但我发现了带有 ActionCable 的 websockets 并将其集成到我的应用程序中。

在本地一切正常,但在部署到我的 Jelastic 环境(使用默认 NGINX/Unicorn 配置)时,我在我的 javascript 控制台中收到此消息,并且在我的访问日志中看不到任何内容

WebSocket connection to 'ws://dev.myapp.com:8080/' failed: WebSocket is closed before the connection is established.

我曾经在我的本地环境中使用过,我通过在我的配置文件中添加所需的 ActionCable.server.config.allowed_request_origins 来解决它。所以我仔细检查了我的开发配置,没问题。

这就是为什么我想知道是否有针对 NGINX 配置的特定内容,而不是 ActionCable git 页面上解释的内容

bundle exec puma -p 28080 cable/config.ru

对于我的应用程序,我遵循了 enter link description here 中的所有内容,但没有提及 NGINX 配置

我知道带有 ActionCable 的 websocket 是相当新的,但我希望有人能够在这方面给我指导

非常感谢

【问题讨论】:

  • 我正在尝试解决与此相关的我自己的问题,但我的 Rails 5 ActionCable 设置还需要设置 config/redis/cable.yml,以便将生产 url 设置为默认值以外的其他内容本地主机行。我正在使用 Heroku 进行生产,并且由于 ActionCable 使用 Redis,我将 Heroku-Redis 插件添加到我的应用程序中,并从我的 Heroku 环境变量中使用了ENV['REDIS_URL']。我通读了您的问题,并想我会提到除了您尝试过的之外我还必须做的事情。警告:生产仅适用于所有测试设备中的 2 台设备:(
  • 我刚刚发现了我的问题,但我花了很多时间。我遇到了很多问题(明天我会回答我的问题)。我也需要 config/redis/cable.yml 但我不知道如何在其中设置密码(我刚刚找到)。我已经读过使用 Heroku 进行配置并不容易,祝你好运;)
  • 谢谢 :) 它总共适用于两个设备。除此之外,没有人可以连接到电缆。一旦我想通了,我会写一篇我认为的博客文章。 Rails 5 发布后,很多人都会尝试使用 Heroku

标签: nginx jelastic ruby-on-rails-5 actioncable


【解决方案1】:

好的,我终于设法解决了我的问题。以下是允许这项工作的不同步骤:

1.nginx :我真的不知道这是否需要,但由于我的应用程序与 Unicorn 一起运行,我将其添加到我的 nginx 配置中

upstream websocket {
  server 127.0.0.1:28080;
}

server {
  location /cable/ {
    proxy_pass http://websocket/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
  }
}

然后在我的config/environments/development.rb 文件中:

config.action_cable.url = "ws://my.app.com/cable/"

2.Allowed request origin:然后我注意到我的连接被拒绝,即使我在我的config/environments/development.rb 文件中使用ActionCable.server.config.allowed_request_origins。我想知道这是否不是由于文档中所述的开发默认设置为http://localhost:3000。所以我添加了这个:

ActionCable.server.config.disable_request_forgery_protection = true

我还没有生产环境,所以我还不能测试它会怎么样。

3.Redis 密码:如文档中所述,我使用的是config/redis/cable.yml,但出现此错误:

Error raised inside the event loop: Replies out of sync: #<RuntimeError: ERR operation not permitted>
/var/www/webroot/ROOT/public/shared/bundle/ruby/2.2.0/gems/em-hiredis-0.3.0/lib/em-hiredis/base_client.rb:130:in `block in connect'

所以我明白我为我的 redis 服务器设置密码的方式不好。

事实上你必须这样做:

development:
  <<: *local
  :url: redis://user:password@my.redis.com:6379
  :host: my.redis.com
  :port: 6379

现在一切正常,Actioncable 确实令人印象深刻。

也许我的一些问题是微不足道的,但我正在分享它们以及我如何解决它们,以便每个人都可以在需要时选择一些东西

【讨论】:

  • 您可以将:ActionCable.server.config.disable_request_forgery_protection = true 更改为 ActionCable.server.config.allowed_request_origins = %w( ws://my.app.com/ )
  • 我忘了提到我在我的本地环境中尝试了类似的东西并且它正在工作。但是部署到我的开发环境并放置开发网址,它不起作用。顺便说一句,我认为您的协议有误,因为它应该是 http:// 而不是 ws:// ?
  • 是的,我错了,目前我正试图让同样的事情发挥作用。我有三个环境:-localdev、开发(远程)服务器、生产(远程)服务器,它在 localdev 上运行良好但是我不得不回退并在开发服务器上使用ActionCable.server.config.disable_request_forgery_protection = true,因为我不知道为什么我的建议使用allowed_request_origins 还没有工作。
  • 我很确定他们在开发环境时会强制 ActionCable.server.config.allowed_request_origins 到 localhost:3000(如他们的文档中所写)。
  • 最新版本的 rails 的电缆配置在 config/cable.yml 而不是 config/redis/cable.yml
猜你喜欢
  • 2018-03-26
  • 2021-03-09
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 2015-11-26
  • 2019-06-08
相关资源
最近更新 更多