2017-02-16 8 views
22

Ich habe eine Rails 5 App, die Action Cable für Websocket-Funktionalität verwendet.ActionCable funktioniert nicht mehr in der Produktionsumgebung

In meiner Entwicklungsumgebung funktioniert alles wie erwartet und die Browser-Clients verbinden sich erfolgreich mit den Action Cable Kanälen.

In meiner Produktionsumgebung arbeitete Action Cable irgendwann, aber dann hörte plötzlich auf zu funktionieren, ohne irgendeine unmittelbare Ursache.

Wenn ich die RAILS_ENV zu production während der Ausführung der App auf meinem Entwicklungscomputer Action Cable funktioniert, funktioniert gut. Etwas scheint anders zu sein, wenn die App auf der tatsächlichen Produktionsmaschine ausgeführt wird, obwohl die grundlegende Umgebung dieselbe ist.

Der spezifische Fehler, den ich in der Chrome-Konsole sehen:

mydomain.com/:1 WebSocket connection to 'wss://mydomain.com/cable' failed: WebSocket is closed before the connection is established. Ich bekomme einen ähnlichen Fehler in anderen Browsern, so dass es nicht Browser-bezogen erscheint. Ich habe alle Adblocker während des Tests deaktiviert, nur um sicher zu gehen, dass sie nicht stören.

Development.rb ENV relevantes Setup:

config.action_cable.url = "ws://localhost:#{port}/cable" 

Production.rb ENV relevantes Setup:

hostname = ENV.fetch('HOSTNAME') 
    port = ENV.fetch('PORT') 
    base_url = "#{hostname}:#{port}" 

    config.action_cable.url = "wss://#{hostname}/cable" 
    config.action_cable.allowed_request_origins = ["https://#{base_url}", "https://#{hostname}"] 

I Puma als Webserver verwenden. Der Webserver bedient eine SSL-Verbindung, für die ein gültiges Zertifikat installiert ist. Auf der Produktionsmaschine bedient Puma die Applikation auf Port 3000, wird aber im Router an Port 443 weitergeleitet.

Der einzige bemerkenswerte Unterschied mit dem Ausführen der App auf meinem Dev-Computer und Produktion ist, dass in der Produktion SSL verwendet wird.

+0

Verwenden Sie AWS? – Shannon

+0

@Shannon Nope, gehostet mit Docker-Container auf einem Synology NAS – edwardmp

+0

Ich kann dieses Problem nicht aus Mangel an rep kommentieren; Was benutzt du, um das zu bedienen? Nginx? Apache? Die Tatsache, dass es lokal mit "production" arbeitet, weist auf ein Problem mit der Webserverkonfiguration hin. Welchen Docker-Container benutzen Sie? Welches Betriebssystem läuft auf Ihrem NAS? Brauche all diese Infos. – FanaHOVA

Antwort

7

ich jetzt dies einen Fehler sicher schließen können zu hören, wahrscheinlich in Rails/ActionCable selbst. Dies wird durch andere Berichte bestätigt und wie ich an einem Punkt sagte, es funktionierte gut, das war, als ich Schienen verwendet.Als ich auf 5.0.1 aktualisierte es brach und es bleibt gebrochen auf 5.0.2. Ich öffne ein Problem auf dem GitHub issue tracker des Rails-Projekts.

Edit Juli 2017: Rails hat etwas geändert, wie es liest und schreibt in den Rack-Sockel, aber die tatsächliche Webserver-Software, die Sie verwenden, muss diese nonblocking lesen und schreiben Methoden unterstützen. In meinem Fall hatte Puma damals noch keine Websockets, die nicht funktionierten. Für Puma gibt es jetzt eine neue Version mit einem Workaround für dieses Problem.

+0

In meinem Fall war es eine falsche Memotisierung des AR-Modells, also Das entsprechende Modell wurde für den anderen Chat-Raum nicht geladen. – artificis

2

Wie pro Ihre Problemstellung

  • Ihre Entwicklungsumgebung funktioniert, weil Sie es eingestellt haben unsichere Web-Datenverkehr zu handhaben, sondern auf Ihre Produktionsumgebung wird sicheren Verkehr zu handhaben.

Development.rb ENV relevantes Setup:

config.action_cable.url = "ws://localhost:#{port}/cable" 

Production.rb ENV relevantes Setup:

config.action_cable.url = "wss://#{hostname}/cable" 

Nach Ihrem Netzwerk-Setup haben Sie konfiguriert Ihre SSL-Port-Umleitung zu Port 3000 a nd serving Web-Anfrage von PUMA rb server.

nun das Problem, das ich hier sehe, ist wss://#{hostname} versuchen wird, auf Standard-Port 443 für den sicheren Datenverkehr statt Ihre umgeleiteten Port 3000

+0

Sie haben Recht, auf meinem Dev-Rechner verwende ich kein SSL. Port 443 wird an 3000 weitergeleitet, das sollte eigentlich keinen Unterschied machen, oder? – edwardmp

+0

Sie müssen einen Port in der URL hinzufügen. Ihr Hosting-Server Puma kümmert sich um die Manipulation des Datenverkehrs. – Mozfox

+0

Okay, lass mich das versuchen, obwohl es keinen Unterschied aufgrund der Weiterleitung zwischen den beiden Ports geben sollte – edwardmp

Verwandte Themen