2016-07-26 232 views
8

当我连接到我的Rails 5 + ActionCable应用程序时,在我的Chrome浏览器中获得WebSocket connection to 'ws://{hostname}/cable' failed: WebSocket is closed before the connection is established.。在我的本地开发环境中,它不会发生。它只发生在我的舞台和制作环境中。Rails5 + ActionCable:连接到'ws:// {主机名} /电缆'的WebSocket连接失败:在连接建立之前关闭WebSocket

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的成功,但其余的是未知的。你有解决这个问题的线索吗?

+0

我通过从Elastic Beanstalk中删除负载平衡来解决此问题,即通过创建新环境而不自动缩放。我想在负载均衡的时候有一些关于HTTP头的问题。 –

+0

我有同样的问题 –

+0

你能否详细说明一下?你在AWS吗? –

回答

0

作为该问题的作者,已经评论过websocket连接失败的可能原因是由于在错误配置Loadbalancer后发生请求重写。

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

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

<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> 
相关问题