2015-09-01 2 views
3

J'expérimente ActionCable (en répliquant principalement le DHH example) et en essayant de l'exécuter sur un serveur Ubuntu avec thin (sur le port 8443) et nginx. Tout fonctionne très bien localement, mais quand j'essaie de le faire sur un serveur en direct, j'obtiens cette réponse d'erreur: failed: Error during WebSocket handshake: Unexpected response code: 301.Configuration de nginx en proxy thin et Rails ActionCable

Voilà mes bits pertinents de ma configuration nginx:

server { 
    listen 80; 

    server_name _not_; 
    root /home/ubuntu/www/; 
} 

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

upstream websocket { 
    server 127.0.0.1:8443; 
} 

server { 

    listen 80; 

    ... 

    location /websocket/ { 
    proxy_pass http://127.0.0.1:8443; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $connection_upgrade; 
    proxy_redirect off; 
    } 

    ... 

} 

Je suis un peu hors de ma ligue avec nginx ici - ce que je manque ou faire mal?

+0

Est-ce que cela se produise dans 60sec? – Anatoly

+0

@Anatoly Ouvre-t-il/ferme-t-il en 60 secondes? Il ne se connecte pas du tout à la WebSocket. – Michael

+0

Je ne suis pas sûr, bu je ne pense pas que votre serveur websockets devrait écouter 80. Il docs NGINX, il écoute 8020. https://www.nginx.com/blog/websocket-nginx/ –

Répondre

1

Je suis revenu à cela après un mois et j'ai découvert que les problèmes n'étaient pas liés à la configuration de nginx mais plutôt liés à la finesse. Je l'ai fait trois choses:

(1) Configuré fines pour the Faye adapter:

# config.ru 

require 'faye' 
Faye::WebSocket.load_adapter('thin') 

require ::File.expand_path('../config/environment', __FILE__) 

use Faye::RackAdapter, mount: '/faye', timeout: 25 

run Rails.application 

(2) Switched au montage ActionCable dans routes.rb, plutôt que d'essayer de l'exécuter as a standalone.

#routes.rb 

MyAwesomeApp::Application.routes.draw do 

    ... 

    match "/websocket", to: ActionCable.server, via: [:get, :post] 

end 

(3) à ma configuration Retourné nginx normale, les websockets upstreaming mince (comme le serveur Web fait:

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

upstream thin { 
    server 127.0.0.1:3000; 
} 

server { 
    ... 

    location /websocket { 
    proxy_pass http://thin; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $connection_upgrade; } 

    ... 
} 

Alors, mes excuses nginx, je vous exonérant - semble les questions ont été principalement liés à minces


Edit:. J'ai ajouté l'ancienne configuration nginx mon retour à après le montage des itinéraires a noter aussi, pour ceux qui utilisent le protocole SSL est que.va casser le websocket sécurisé wss. Au lieu de cela, vous devez effectuer force_ssl au niveau du contrôleur, as recommended here, et configurer nginx pour réécrire toutes les routes HTTP vers HTTPS.

+0

Avez-vous pu garder le même type de nginx.conf listé dans votre question, quand vous êtes monté dans routes.rb? (2) –

+1

@DavidKuhta J'ai édité la réponse pour inclure la configuration de nginx à laquelle je suis retourné et aussi donner un conseil SSL qui m'a causé des problèmes. – Michael

0

Ce thread m'a été très utile, mais j'ai choisi de séparer le processus AC en une instance séparée de puma afin que je puisse configurer les travailleurs, etc séparément. J'ai ajouté plus tard le proxy SSL de nginx pour m'assurer que les derniers chiffrements, etc. sont utilisés. Cela évite que les rails/puma/AC aient à se soucier de SSL vs non-SSL; tout est non-SSL dans l'instance du serveur.

Voici ma section serveur pour AC:

server { 
    listen 881 ssl; 


    ssl_certificate /etc/nginx/ssl/server.crt; 
    ssl_certificate_key /etc/nginx/ssl/server.key; 

    ssl_prefer_server_ciphers on; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; 


    server_name localhost; 
    location/{ 
     proxy_pass http://cable; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
    } 
} 

Note de cette github issue: vous devez vous assurer que votre configuration AC permet à votre domaine en tant que source:

#config/initializers/cable.rb 
ActionCable.server.config.allowed_request_origins = %w(http://my-domain.com )