NGINX配置Rails 5 ActionCable与puma

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还相当新,但我希望有人能给我一些指引。

非常感谢。


我正在尝试解决与此相关的问题,但我的Rails 5 ActionCable设置还需要设置config/redis/cable.yml,以便将生产URL设置为默认的本地主机行之外的其他内容。我在生产中使用Heroku,由于ActionCable使用Redis,因此我向我的应用程序添加了Heroku-Redis插件,并从我的Heroku环境变量中使用了ENV ['REDIS_URL']。我阅读了您的问题并想提到我所做的其他事情,超出了您尝试过的范围。注意:在我测试的所有设备中,仅有2个设备可以在生产环境下工作:( - Jake Smith
我刚刚解决了我的问题,但花费了我很多时间。我遇到了许多问题(我明天会回答我的问题)。我也需要config/redis/cable.yml文件,但我不知道如何在其中设置我的密码(我刚刚找到了)。我读到在Heroku上配置它不容易,所以祝你好运;) - phyzalis
谢谢 :) 它可以用于两个设备。超过这个数量,没有人能够连接到电缆。一旦我弄清楚了,我想要写一篇博客文章。一旦Rails 5发布,很多人将会尝试在Heroku上使用它。 - Jake Smith
1个回答

23

好的,我终于成功解决了我的问题。以下是不同的步骤,使这项工作得以完成:

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.允许的请求来源:我发现即使在我的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/ ) - dane
嗨,@phyzalis,你最终是在Puma还是Unicorn上运行Action Cable服务器?因为标题仍然显示为Puma。 - sethi
在使用ActionCable时我选择了Puma,但我的应用程序是在Unicorn上运行的。 - phyzalis
如果你的Mac只用于开发,我认为你不需要nginx配置。我猜想你在Mac上使用webrick,因此Nginx配置仅适用于生产环境(或staging服务器)。顺便说一下,很抱歉我对nginx配置不够熟悉,无法提供更多帮助。 - phyzalis
如果您使用相同的主机来运行您的ActionCable,最简单的方法是使用config.action_cable.url =“/cable”。 - Kevin
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接