2016-07-05 3 views
10

ich ein Problem habe bei der Verbindung in nicht-Entwicklungsumgebungen mit diesen Log-MeldungenAktion Kabel nicht in der Lage (Fehler beim WebSocket Upgrade) zu verbinden

Failed to upgrade to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: close, HTTP_UPGRADE:) 

Finished "/cable/"[non-WebSocket] for 127.0.0.1 at 2016-07-06 09:44:29 +1000 

ich ein wenig debuggged WebSocket und rechneten die Anfrage aussandte durch den Browser/Javascript ist nicht genau das gleiche wie die Anfrage von Einhorn (mit nginx läuft).

Der Request-Header vom Browser ist

GET ws://cc-uat.com.au/cable HTTP/1.1 
Host: cc-uat.com.au 
Connection: Upgrade 
Pragma: no-cache 
Cache-Control: no-cache 
Upgrade: websocket 
Origin: http://cc-uat.com.au 
Sec-WebSocket-Version: 13 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 
Cookie: <Lot of cookies> 
Sec-WebSocket-Key: QGdJkYIA2u7vtmMVXfHKtQ== 
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits 
Sec-WebSocket-Protocol: actioncable-v1-json, actioncable-unsupported 

Die Verbindung ist hier 'Upgrade' aber die websocket Anfrage hat die Verbindung 'geschlossen' (wahrscheinlich nginx ist es vermasselt?)

Und das Stück Code in websocket Fahrer versagt

def self.websocket?(env) 
     connection = env['HTTP_CONNECTION'] || '' 
     upgrade = env['HTTP_UPGRADE'] || '' 

     env['REQUEST_METHOD'] == 'GET' and 
     connection.downcase.split(/ *, */).include?('upgrade') and 
     upgrade.downcase == 'websocket' 
end 

Updates

Das ist meine nginx Konfiguration

upstream app { 
    server unix:/home/osboxes/sites/actioncable-examples/shared/sockets/unicorn.sock fail_timeout=0; 
} 

server { 
    listen 80; 
    server_name localhost; 

    root /home/osboxes/sites/actioncable-example/public; 

    try_files $uri/index.html $uri @app; 

    location @app { 
     proxy_pass http://app; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_redirect off; 
     proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
    } 


    error_page 500 502 503 504 /500.html; 
    client_max_body_size 4G; 
    keepalive_timeout 10; 
} 

I actioncable Server auf/Kabel

mount ActionCable.server => "/cable" 

Mit den nginx Änderungen angebracht habe ich in der Lage bin erfolgreich den Handshake haben, aber der Server ist nicht in der Lage, das Herz zu senden Beats und die Verbindung sinkt weiter.

Started GET "/cable" for 127.0.0.1 at 2016-07-07 05:48:06 +0100 
Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2016-07-07 05:48:06 +0100 
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: upgrade, HTTP_UPGRADE: websocket) 
+1

In welcher Version von Nginx laufen Sie? Ich denke WebSockets werden seit 1.3 unterstützt. Haben Sie "Upgrade" und "Connection" Header als https://www.nginx.com/blog/websocket-nginx/ vorgeschlagen? –

+0

aktualisierte Frage !! @JuliuszGonera – sethi

+1

Dies funktioniert für mich mit Nginx 1.7.12: https://gist.github.com/jgonera/91aa8c1f4e38bf0169ccc3adc00be90c –

Antwort

2

Haben Sie die config.action_cable.allowed_request_origins in production.rb Verbindungen von Produktionsdomäne zu ermöglichen? In meinem nginx.conf ist es

proxy_set_header X-Real-IP $remote_addr; 
proxy_set_header X-Forwarded-Proto http; 

Ich bin nicht ganz sicher, auch wenn sie wirklich benötigt werden, aber es funktioniert für mich.

+0

Haben Sie es auf Unicorn versucht? Welche Version? – sethi

0

Rails 5 Aktion Kabel CORS:

eine rubin Datei heißt action_cable.rb in my_rails_project/config/initializers erstellen und den folgenden Code hinzu.

if Rails.env.development? 
    Rails.application.config.action_cable.allowed_request_origins = ['http://localhost:3001', 'http://127.0.0.1:3001'] 
end 

Sie sind fertig.

Verwandte Themen