2016-01-08 9 views
13

Ich verwende Jelastic für meine Entwicklungsumgebung (noch nicht in Produktion). Meine Anwendung läuft mit Unicorn, aber ich habe Websockets mit ActionCable entdeckt und in meine Anwendung integriert.NGINX Konfiguration für Rails 5 ActionCable mit Puma

Alles funktioniert in lokaler Ordnung, aber wenn meine Jelastic Umgebung (mit der Standard-NGINX/Unicorn-Konfiguration) bereitstellen, erhalte ich diese Nachricht in meiner Javascript-Konsole und ich sehe nichts in meinem Zugriffsprotokoll

WebSocket connection to 'ws://dev.myapp.com:8080/' failed: WebSocket is closed before the connection is established. 

Ich hatte in meiner lokalen Umgebung und ich löste es, indem ich die benötigten ActionCable.server.config.allowed_request_origins in meiner Konfigurationsdatei hinzufügte. Also habe ich meine Entwicklungskonfiguration dafür überprüft und es ist ok.

Deshalb habe ich mich gefragt, ob es etwas spezifisch für NGINX Config, sonst als das, was

auf ActionCable git Seite erklärt
bundle exec puma -p 28080 cable/config.ru 

Für meine Anwendung, folgte ich alles von enter link description here aber über NGINX Konfiguration erwähnt nichts ist

ich weiß, dass websocket mit ActionCable ganz neu ist, aber ich hoffe, dass jemand mir Vielen dank einen Vorsprung zu geben, dass

wäre in der Lage
+0

benötigt Ich versuche, mein eigenes Problem im Zusammenhang mit dieser zu lösen, aber meine Rails 5 ActionCable Sets up muss auch die 'config/redis/cable.yml' so eingerichtet sein, dass die Produktions-URL auf etwas anderes als die Standard-localhost-Zeile gesetzt wurde. Ich verwende Heroku für die Produktion, und da ActionCable Redis verwendet, habe ich das Add-On Heroku-Redis zu meiner Anwendung hinzugefügt und 'ENV ['REDIS_URL']' von meinen Heroku-Umgebungsvariablen verwendet. Ich habe deine Frage durchgelesen und überlegt, was ich noch über das hinaus tun sollte, was du versucht hast. Vorbehalt: Produktion funktioniert nur mit 2 Geräten von allen getesteten mit :( –

+0

Ich habe gerade mein Problem, aber es dauerte so viel Zeit. Und ich stieß auf viele Probleme (ich werde auf meine Frage morgen beantworten). Ich war um die config/redis/cable.yml auch, aber ich wusste nicht, wie in es mein Passwort setzen (ich gerade gefunden habe) ich habe es mit Heroku so viel Glück nicht einfach zu konfigurieren war;) – phyzalis

+0

Danke.:) Es funktioniert für zwei Geräte insgesamt. Darüber hinaus kann sich niemand an das Kabel anschließen. Sobald ich es herausgefunden habe, werde ich einen Blogpost schreiben, denke ich. Sobald Schienen 5 ist, viele Leute wird es mit Heroku –

Antwort

16

Ok, also habe ich es endlich geschafft, mein Problem zu beheben. Hier sind die verschiedenen Schritte, die diese Arbeit machen erlaubt:

1.nginx: Ich weiß es nicht wirklich, wenn dies erforderlich ist, aber als meine Anwendung mit Einhorn läuft, habe ich dies in meiner nginx conf

upstream websocket { 
    server 127.0.0.1:28080; 
} 

server { 
    location /cable/ { 
    proxy_pass http://websocket/; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "Upgrade"; 
    } 
} 

Und dann in meiner config/environments/development.rb Datei:

config.action_cable.url = "ws://my.app.com/cable/" 

2.Allowed Anfrage Herkunft: ich habe dann bemerkt, dass meine Verbindung sogar verweigert wurde, wenn ich ActionCable.server.config.allowed_request_origins in meiner config/environments/development.rb Datei wurde. Ich frage mich, ob dies nicht auf den Entwicklungsstandard wie http://localhost:3000, wie in der Dokumentation angegeben, zurückzuführen ist. So habe ich habe dieses Bild:

ActionCable.server.config.disable_request_forgery_protection = true 

Ich habe noch nicht eine Produktionsumgebung so ist ich nicht noch in der Lage zu testen, wie es sein wird.

3.Redis Kennwort: wie in der Dokumentation angegeben, wurde ich mit einem config/redis/cable.yml aber ich diesem Fehler habe:

Error raised inside the event loop: Replies out of sync: #<RuntimeError: ERR operation not permitted> 
/var/www/webroot/ROOT/public/shared/bundle/ruby/2.2.0/gems/em-hiredis-0.3.0/lib/em-hiredis/base_client.rb:130:in `block in connect' 

So verstand ich die Art, wie ich mein Passwort einstellen für meinen redis Server nicht war gut.

In der Tat haben Sie so etwas zu tun:

development: 
    <<: *local 
    :url: redis://user:passw[email protected]:6379 
    :host: my.redis.com 
    :port: 6379 

Und jetzt alles funktioniert prima und Actioncable ist wirklich beeindruckend.

waren vielleicht trivial einige meiner Probleme, aber ich sich teilen bin und wie ich sie gelöst, so dass jeder etwas holen, wenn

+0

versuchen Sie ändern könnte: '' 'ActionCable.server.config.disable_request_forgery_protection = true''' zu' '' ActionCable.server.config.allowed_request_origins =% w (ws: //my.app.com/) '' ' – dane

+0

Ich vergaß zu erwähnen, dass ich etwas ähnliches mit meiner lokalen Umgebung versuchte und es funktionierte. Aber die Bereitstellung in meiner Entwicklungsumgebung und das Setzen der Dev-URL funktionierte nicht. Übrigens denke ich, du liegst falsch mit deinem Protokoll, wie es sein sollte http: // und nicht ws: //? – phyzalis

+0

Ja, ich habe mich geirrt und derzeit versuche ich, das gleiche zur Arbeit zu bringen. Ich habe drei Umgebungen: -localdev, Entwicklung (remote) Server, Produktion (remote) Server und es funktioniert gut auf localdev aber ich musste Fallback und verwenden Sie '' 'ActionCable.server.config.disable_request_forgery_protection = true''' auf dem Dev Server, da ich noch nicht herausfinden kann, warum mein Vorschlag, "allowed_request_origins" zu verwenden, noch nicht funktioniert. – dane