2016-01-27 6 views
6

Hallo Ich versuche einen einfachen Chat mit ror 5.0.0 beta (mit Puma) im Produktionsmodus (in localhost gibt es keine Probleme) zu dienen .RoR 5.0.0 ActionCable wss WebSocket Handshake: Unerwarteter Response Code: 301

Das ist mein Nginx Konfiguration:

upstream websocket { 
    server 127.0.0.1:28080; 
} 


server { 

    listen 443; 
    server_name mydomain; 
    ssl_certificate ***/server.crt; 
    ssl_certificate_key ***/server.key; 
    ssl on; 
    ssl_session_cache builtin:1000 shared:SSL:10m; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers 
HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; 
    ssl_prefer_server_ciphers on; 
    access_log /var/log/nginx/jenkins.access.log; 

    location/{ 
     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header X-Forwarded-Proto $scheme; 
     proxy_pass http://localhost:3000; 
     proxy_read_timeout 90; 

     proxy_redirect http://localhost:3000 https://mydomain; 


    location /cable/{ 
     proxy_pass   http://websocket/; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
     proxy_set_header Host $http_host; 
     break; 
    } 

    } 

Dies ist config/redis/cable.yml

Produktion: url: redis: // localhost: 6379/1

entwicklung: url: redis: // localhost: 6379/2

Test: url: redis: // localhost: 6379/3

und config/Umgebungen/production.rb

# Action Cable endpoint configuration 
    config.action_cable.url = 'wss://mydomain/cable' 
    # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] 

    # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. 
    config.force_ssl = false 

Und das ist der Fehler Ich erhalte:

application - [...]. Js: 27 WebSocket-Verbindung zu 'wss: // mydomain/cable' fehlgeschlagen: Fehler beim WebSocket-Handshake: Unerwarteter Antwortcode: 301

Irgendwelche Tipps? :) Danke

Antwort

2

I gelöst Phusion Passagier hinzufügen.

nginx Config ist nun:

server{ 
listen 80; 
passenger_enabled on; 
passenger_app_env production; 
passenger_ruby /../ruby-2.3.0/ruby; 
root /path to application/public; 
client_max_body_size 4G; 
keepalive_timeout 10; 
[...] 

    location /cable{ 
     passenger_app_group_name websocket; 
     passenger_force_max_concurrent_requests_per_process 0; 
    } 
} 

Sie müssen Standardordner entfernen config/redis/cable.yml und die Datei bewegen/config nur.

Für SSL nur Standard-SSL-Optionen aktivieren und es wird Werke .-)

Danke an alle für die Hilfe

0

Ihr Websocket URI ist /cable/ und nicht /cable, so dass letztere den location / Block treffen wird. Versuchen:

location /cable { 
    rewrite ^/cable$/break; 
    rewrite ^/cable(.*)$ $1 break; 
    proxy_pass   http://websocket; 
    ... 
} 

Auch nicht sicher, benötigen Sie einen break; drin. Ich vermute, die fehlende } zwischen den beiden location Blöcken ist nur ein Tippfehler in der Frage.

EDIT1: Hinzugefügt rewrite, um korrekte Upstream-Mapping wiederherzustellen.

EDIT2: Alternative Lösung ist ausdrücklich /cable zu /cable/ wie folgt zu umschreiben:

location = /cable { rewrite^/cable/ last; } 
location /cable/ { 
    proxy_pass http://websocket/; 
    ... 
} 
+0

Ändern Standort/Kabel/{...} zum/Kabel zurückkehren me „WebSocket-Verbindung zu" wss: // mydomain/cable 'fehlgeschlagen: Fehler beim WebSocket-Handshake: Unerwarteter Response-Code: 502 " –

+0

Schlechter Gateway - Stellen Sie sicher, dass der Dienst auf Port 28080 läuft –

+0

Firewall blockierte diesen Port, jetzt habe ich redis auf 4443 und "upstream websocket" {127.0.0.1:4443} -> Fehler beim WebSocket-Handshake: Unerwarteter Response-Code: 404 Zumindest mein Fehlercode ändert sich xd –

0

ich fast 5 Stunden gestern damit verbringen, dieses besondere Problem zu lösen. Ich endete mit der Verwendung einer separaten Domäne für die Websocket-Verbindung namens ws.example.com als alles andere in einem 301 redirect führte.

Hier ist meine nginx.conf Datei. Ich habe die SSL-Teile entfernt, aber Sie könnten einfach Ihre eigenen einfügen. Beachten Sie, dass Sie nginx 1.4+ benötigen, da vor dieser Version kein Websocket-Proxying unterstützt wird.

upstream socket { 
    server unix:/mysocket fail_timeout=0; 
} 

upstream websocket { 
    server 127.0.0.1:28080; 
} 

map $http_upgrade $connection_upgrade { 
    default upgrade; 
    '' close; 
} 

server { 
    listen  443 ssl; 
    server_name ws.example.com; 
    access_log off; 

    # SSL configs here 

    location/{ 
     proxy_pass http://websocket/; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header Host $host; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection $connection_upgrade; 
    } 
} 

server { 
    listen  443 ssl; 
    server_name example.com; 

    # SSL configs here 

    location @app { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    proxy_pass http://socket; 
    } 

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

Ich habe irgendwo gelesen, dass allowed_request_origins nicht wie erwartet funktionierte so ging ich den sicheren Weg (bis der Fehler behoben ist) und drehte den Kontrolleur völlig ActionCable.server.config.disable_request_forgery_protection = true verwenden.

Hier ist meine cable.ru Datei für den Start Aktion Kabel.

require ::File.expand_path('../../config/environment', __FILE__) 
Rails.application.eager_load! 

require 'action_cable/process/logging' 

Rails.logger.level = 0 
ActionCable.server.config.disable_request_forgery_protection = true 

run ActionCable.server 

Ich verwende auch die neueste Rails-Version von Github.

gem "rails", github: "rails/rails" 
Verwandte Themen