【问题标题】:Rails5 + ActionCable: WebSocket connection to 'ws://{hostname}/cable' failed: WebSocket is closed before the connection is establishedRails5 + ActionCable:到“ws://{hostname}/cable”的 WebSocket 连接失败:在建立连接之前关闭 WebSocket
【发布时间】:2016-11-30 05:06:44
【问题描述】:

连接到我的 Rails 5 + ActionCable 应用程序时,我在 chrome 浏览器中收到 WebSocket connection to 'ws://{hostname}/cable' failed: WebSocket is closed before the connection is established.。在我的本地开发环境中,它不会发生。它只发生在我的登台和生产环境中。

Successful screenshot on development

Failed screenshot on staging

我使用 Amazon ElasticBeanstalk 部署我的应用程序。在使用 chrome 开发者工具监控请求后,我发现与开发环境不同,WebSocket 请求暂存,生产环境没有得到响应(待处理),所以 ActionCable 不断尝试连接到 WebSocket 端点(ws://{hostname}/电缆)。

问题是,在我的 puma.log 中,它是这样说的:

I, [2016-07-26T13:45:53.921154 #32369]  INFO -- : Registered connection (Z2lkOi8vYXNrLWNvLWRlL1VzZXIvMg)
I, [2016-07-26T13:46:05.775788 #32369]  INFO -- : Finished "/cable/" [WebSocket] for 121.166.105.106 at 2016-07-26 13:46:05 +0000
I, [2016-07-26T13:46:18.074895 #32369]  INFO -- : [917fd706-4f1a-4178-bd95-7a33c0c7b621] Started GET "/cable" for 121.166.105.106 at 2016-07-26 13:46:18 +0000
I, [2016-07-26T13:46:18.075764 #32369]  INFO -- : [917fd706-4f1a-4178-bd95-7a33c0c7b621] Started GET "/cable/" [WebSocket] for 121.166.105.106 at 2016-07-26 13:46:18 +0000
I, [2016-07-26T13:46:18.075817 #32369]  INFO -- : [917fd706-4f1a-4178-bd95-7a33c0c7b621] Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)

也就是说,升级到 WebSocket 是成功的,但其余的未知。你有解决这个问题的线索吗?

【问题讨论】:

  • 我通过从 Elastic Beanstalk 中删除负载平衡解决了这个问题,也就是说,通过创建一个没有自动缩放的新环境。我猜想在负载平衡时 HTTP 标头存在一些问题。
  • 我也有同样的问题
  • 您能详细说明一下吗?你在 AWS 上吗?
  • 您是否设法通过负载均衡器找到解决此问题的方法?

标签: ruby-on-rails web-services amazon-elastic-beanstalk actioncable


【解决方案1】:

正如问题的作者已经评论的那样,websocket 连接失败的可能原因是由于在配置错误的负载均衡器后面进行了请求重写。

例如,我遇到了一个配置错误的 Apache 服务器,其中重写规则用于将使用的协议从 http 重写为 rails 应用程序的 ws。

如果它可以帮助其他人,那么在这种情况下启用 websockets 的工作 Apache VHost 配置。

<VirtualHost domain.of.the.rails-app:80>
    ServerName domain.of.the.rails-app
    DocumentRoot /var/www/apps/rails-app/public
    ProxyPreserveHost On
    ProxyPass /error-documents !
    ErrorDocument 503 /error-documents/503.html
    Alias /error-documents /var/www/apps/rails-app/public
    ProxyPass / http://0.0.0.0:3000/
    ProxyPassReverse / http://0.0.0.0:3000/
    RewriteEngine on
    RewriteCond %{HTTP:UPGRADE} websocket [NC]
    RewriteRule /(.*) ws://localhost:3000/$1 [P]
</VirtualHost>

【讨论】:

    猜你喜欢
    • 2020-04-07
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 2018-06-13
    • 2019-12-14
    • 1970-01-01
    • 2020-02-03
    相关资源
    最近更新 更多