2016-01-08 11 views
13

Sto usando Jelastic per il mio ambiente di sviluppo (non ancora in produzione). La mia applicazione è in esecuzione con Unicorn, ma ho scoperto i websocket con ActionCable e l'ho integrato nella mia applicazione.Configurazione NGINX per Rails 5 ActionCable con puma

Tutto sta funzionando bene in locale, ma quando si distribuiscono al mio ambiente Jelastic (con la Nginx/configurazione di Unicorn predefinita), sto ottenendo questo messaggio nella mia console javascript e non vedo nulla nel mio log di accesso

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

Avevo un ambiente locale e l'ho risolto aggiungendo il necessario ActionCable.server.config.allowed_request_origins nel mio file di configurazione. Quindi ho ricontrollato la configurazione di sviluppo per questo ed è ok.

Ecco perché mi chiedevo se c'è qualcosa di specifico per Nginx config, altro che quello che viene spiegato a ActionCable git pagina

bundle exec puma -p 28080 cable/config.ru 

Per la mia applicazione, ho seguito tutto da enter link description here ma nulla è menzionato sulla configurazione Nginx

so che websocket con ActionCable è abbastanza nuovo, ma spero che qualcuno sarebbe in grado di darmi un vantaggio su quella

Molte grazie

+0

che sto cercando di risolvere il mio proprio problema relativo a questo, ma i miei Rails 5 ActionCable set anche richiesto 'config/redis/cable.yml' per essere impostato in modo tale che l'URL di produzione fosse impostato su qualcosa di diverso dalla linea di localhost predefinita. Sto usando Heroku per la produzione, e dal momento che ActionCable usa Redis, ho aggiunto l'addon di Heroku-Redis alla mia applicazione e ho usato 'ENV ['REDIS_URL']' dalle mie variabili d'ambiente Heroku. Ho letto la tua domanda e ho pensato di dire cos'altro avrei dovuto fare oltre a quello che hai provato. Caveat: produzione funziona solo con 2 dispositivi tra tutti quelli testati con :( –

+0

Ho appena capito il mio problema ma mi ci è voluto tanto tempo e ho riscontrato molti problemi (risponderò alla mia domanda domani). ho bisogno anche di config/redis/cable.yml ma non sapevo come impostare la mia password (ho appena trovato) Ho letto che non è stato facile configurare con Heroku così buona fortuna;) – phyzalis

+0

Grazie:) Funziona per due dispositivi in ​​totale. Oltre a ciò, nessuno può connettersi al cavo. Una volta capito, scriverò un post sul blog, penso. Una volta uscito Rails 5, molte persone lo provano con Heroku –

risposta

16

Ok, quindi sono finalmente riuscito a risolvere il mio problema. Qui ci sono le diverse fasi che hanno permesso di fare questo lavoro:

1.nginx: Io non so se questo è necessario, ma come la mia applicazione è in esecuzione con unicorno, ho aggiunto questo nel mio 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"; 
    } 
} 

E poi nel mio file config/environments/development.rb:

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

2.Allowed richiesta origine: ho poi notato che la mia connessione è stata rifiutata anche se stavo usando ActionCable.server.config.allowed_request_origins nel mio file config/environments/development.rb. Mi chiedo se questo non è dovuto al default di sviluppo come http://localhost:3000 come indicato nella documentazione. Così ho aggiunto questo:

ActionCable.server.config.disable_request_forgery_protection = true 

non ho ancora un ambiente di produzione quindi non sono ancora in grado di verificare come sarà.

la password 3.Redis: come indicato nella documentazione, stavo usando un config/redis/cable.yml ma ho avuto questo errore:

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' 

Così ho capito il modo in cui stavo installando la mia password per il mio assistente non era Redis bene.

In realtà il tuo hanno a che fare qualcosa di simile:

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

E ora tutto funziona bene e Actioncable è davvero impressionante.

Forse alcuni dei miei problemi erano banale ma sto condividendole e come li ho risolto così ognuno può prendere qualcosa, se necessario

+0

che è possibile modificare: '' 'ActionCable.server.config.disable_request_forgery_protection = true''' a' '' ActionCable.server.config.allowed_request_origins =% w (ws: //my.app.com/) '' ' – dane

+0

Ho dimenticato di dire che ho provato qualcosa di simile con il mio ambiente locale e funzionava. Ma distribuendo nel mio ambiente di sviluppo e inserendo l'URL di sviluppo, non ha funzionato. A proposito, penso che tu abbia torto con il tuo protocollo come dovrebbe essere http: // e non ws: //? – phyzalis

+0

Sì, ho sbagliato e attualmente sto cercando di far funzionare la stessa cosa. Ho tre ambienti: -localdev, server di sviluppo (remoto), server di produzione (remoto) e funziona bene su localdev tuttavia ho dovuto eseguire il fallback e usare '' 'ActionCable.server.config.disable_request_forgery_protection = true''' sullo sviluppatore server perché non riesco ancora a capire perché il mio suggerimento di utilizzare allowed_request_origins non funzioni ancora. – dane