14

我将 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

对于我的应用程序,我遵循了此处输入链接描述中的所有内容,但没有提及 NGINX 配置

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

非常感谢

4

1 回答 1

21

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

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

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

ActionCable.server.config.disable_request_forgery_protection = true

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

3.Redis密码:如文档中所述,我使用的是aconfig/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 确实令人印象深刻。

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

于 2016-01-08T21:23:34.383 回答