8

Ich bekomme WebSocket connection to 'ws://{hostname}/cable' failed: WebSocket is closed before the connection is established. in meinem Chrom-Browser beim Verbinden mit meiner Rails 5 + ActionCable App. In meiner lokalen Entwicklungsumgebung passiert es nicht. Es passiert nur in meiner Staging- und Produktionsumgebung.Rails5 + ActionCable: WebSocket-Verbindung zu 'ws: // {Hostname}/Kabel' fehlgeschlagen: WebSocket wird geschlossen, bevor die Verbindung hergestellt wird

Successful screenshot on development

Failed screenshot on staging

verwende ich Amazon ElasticBeanstalk meine Anwendung zu implementieren. Nach der Überwachung von Anfragen mit dem chrome-Entwickler-Tool habe ich herausgefunden, dass im Gegensatz zur Entwicklungsumgebung die WebSocket-Anfrage im Staging keine Antwort (ausstehend) erhält, so dass ActionCable ständig versucht, eine Verbindung zum WebSocket-Endpunkt herzustellen (ws: // {hostname}/Kabel).

Die Sache ist, in meinem puma.log, sagt es so etwas wie dieses:

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) 

das heißt, ein Upgrade auf WebSocket erfolgreich war, aber der Rest ist nicht bekannt. Hast du einen Hinweis darauf, das zu lösen?

+0

Ich löste dieses Problem, indem ich den Lastenausgleich von Elastic Beanstalk entfernte, dh eine neue Umgebung ohne automatische Skalierung erstellte. Ich denke, es gab ein Problem in Bezug auf HTTP-Header beim Lastenausgleich. –

+0

Ich habe das gleiche Problem –

+0

könnten Sie erarbeiten? Bist du auf AWS? –

Antwort

0

Da der Autor der Frage bereits kommentierte die wahrscheinliche Ursache für diesen Fehler in der Websocket-Verbindung war eine Anforderung neu schreiben, wenn hinter einem falsch konfigurierten Loadbalancer.

Ich habe zum Beispiel einen falsch konfigurierten Apache Server gefunden, wo die Umschreiberegeln vorhanden waren, um das verwendete Protokoll von http nach ws für eine Rails-Anwendung umzuschreiben.

Falls es anderen hier hilft, ist die funktionierende Apache VHost Config, die in diesem Fall websockets aktiviert.

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