2016-03-13 21 views
6

Sto provando a eseguire un'app con le barre 5.0.0beta3 e websockets. Ho tutto lavoro a livello locale in materia di sviluppo, ma nella produzione ho ottenere questa risposta nella console del mio browser:Rails 5 cavo azione SSL in produzione - Connessione WebSocket non riuscita: errore durante l'handshake WebSocket: risposta imprevista 301

"connessione fallita WebSocket: Errore durante WebSocket stretta di mano: la risposta imprevisto 301"

Ecco una mia nginx conf.

upstream app { 
    server unix:/home/dev/workspace/my_app/tmp/sockets/thin.0.sock max_fails=1 fail_timeout=15s; 
    server unix:/home/dev/workspace/my_app/tmp/sockets/thin.1.sock max_fails=1 fail_timeout=15s; 
} 

server { 
    listen 443 ssl; 
    server_name www.my_app.co; 

    root /home/dev/workspace/my_app/public; 
    try_files $uri/index.html $uri @app; 

    location @app { 
    proxy_next_upstream error timeout http_502 http_503; 
    proxy_read_timeout 60s; 

    proxy_pass http://app; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-FORWARDED-PROTO $scheme; 
    proxy_redirect off; 
    } 

    location /websocket/ { 
    proxy_pass http://localhost:28080/; 
    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; 

    ssl on; 
    ssl_certificate /ssl/www.my_app.co.crt; 
    ssl_certificate_key /ssl/www.my_app.co.key; 

    ssl_session_timeout 5m; 

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES"; 
    ssl_prefer_server_ciphers on; 
} 

Sono in esecuzione sottile per il mio assistente app e Running di PUMA per il server WebSockets con Redis a livello locale. Sto tentando di seguire l'app di esempio del cavo azione qui: https://github.com/rails/actioncable-examples.

sto iniziando il mio server puma in questo modo: bundle exec puma -p 28080 cable/config.ru

Con questo puma.rb in config:

workers 1 
threads 1, 10 

app_dir = File.expand_path("../..", __FILE__) 
shared_dir = "#{app_dir}/shared" 

rails_env = ENV['RAILS_ENV'] || "production" 
environment rails_env 

stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true 

pidfile "#{shared_dir}/pids/puma.pid" 
state_path "#{shared_dir}/pids/puma.state" 

Ecco le parti rilevanti della mia production.rb config:

config.action_cable.allowed_request_origins = ['https://www.chatben.co', 'https://45.55.192.195'] 
config.action_cable.url = "wss://www.chatben.co/websocket" 
config.force_ssl = false 

Ecco il mio development.rb config:

config.action_cable.url = "ws://localhost:28080" 
config.action_cable.allowed_request_origins = ['http://localhost:3000'] 
config.action_cable.disable_request_forgery_protection = true 

Nella mia app, comincio il mio cavo in questo modo:

@App = {} 
App.cable = ActionCable.createConsumer() 

Qualsiasi suggerimento sarebbe impressionante. Ho notato qualcuno qui: RoR 5.0.0 ActionCable wss WebSocket handshake: Unexpected response code: 301 è stato in grado di risolvere questo problema utilizzando un dominio separato. Questo è quello che probabilmente proverò, ma speravo che non sarebbe arrivato a quello.

Grazie in anticipo per qualsiasi aiuto! Lo apprezzo molto.

risposta

1

Non riuscivo a capire il mio problema precedente, quindi alla fine ho deciso di schierarlo con il passeggero. Mi chiedo ancora perché ogni richiesta abbia un 301, ma hey, almeno adesso ho delle websocket in produzione!

MODIFICA: Dopo aver letto la risposta di troelskn sopra ho potuto installare un server Puma senza bisogno di Passeggero.

+0

Hai ancora 301? –

21

Il problema è probabile che Rails stia forzando la connessione a ssl. Dato che nginx termina la connessione ssl, è necessario impostare l'intestazione X-Forwarded-Proto per consentire a Rails di sapere che tutto è buono. Ecco una configurazione completa che funziona per me:

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

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-Proto https; 
    proxy_redirect off; 
    } 
+0

Ehi! Ha funzionato! Grazie mille! Ora sto utilizzando un server Puma per il mio server app e websockets. Prima stavo cercando sottile per il mio server app e puma come server websockets stand alone. Non sono sicuro di quali siano gli scambi commerciali, ma sono abbastanza contento che funzioni senza Passenger. Grazie ancora! – BenNapp

+2

Questo dovrebbe essere contrassegnato come la risposta corretta! +1 – aliibrahim

+0

@BenNapp controlla questo problema https://github.com/websocket-rails/websocket-rails/issues/151, poiché puma non è basato su EventMachine, devi utilizzare un server rack basato su macchina degli eventi o eseguire puma in stand modalità sola –

0

per websocket-guide che devo fare questo in Nginx:

location /websocket{ 
    proxy_pass http://localhost:3001/websocket; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "Upgrade";  
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-Proto https; 
    proxy_redirect off; 
    } 

e passare false sul JavaScript per utilizzare http: // invece di WS : //

0

Ho aggiornato la mia risposta in linea di massima è stato abbastanza facile per me che non ho potuto realizzare prima. Ho appena fatto questo nel mio file production.rb dopo aver configurato SSL come nel modo normale nel file conf di nginx.

config.action_cable.allowed_request_origins = [#domains] 

Ha fatto tutto e si collegava correttamente.

Problemi correlati