35 votes

Nginx peut-il être utilisé en tant que proxy inverse pour un serveur WebSocket backend?

Nous travaillons sur Ruby on Rails application qui doit profiter de websockets html5. À l'heure actuelle, nous avons deux "serveurs" pour ainsi dire: notre principale application en cours d'exécution sur nginx+passager, et d'un autre serveur à l'aide de Pratique Naik la Crampe du cadre (qui fonctionne sur de Minces) pour gérer les websocket connexions.

Idéalement, lorsque vient le temps pour le déploiement, nous aurions l'application rails en cours d'exécution sur nginx+passager, et le serveur websocket serait mandaté derrière nginx, donc nous n'aurions pas besoin d'avoir le serveur websocket en cours d'exécution sur un port différent.

Le problème est, dans cette configuration, il semble que nginx est de fermer les connexions à Mince trop tôt. La connexion est établie avec succès à la Fine serveur, puis immédiatement fermé avec un code de réponse de 200. Notre conjecture est que nginx ne se rend pas compte que le client tente d'établir une connexion websocket de la circulation.

Certes, je ne suis pas du tout calée avec nginx config, donc, est-il même possible de configurer nginx pour agir comme un proxy inverse pour un serveur websocket? Ou dois-je attendre pour nginx pour offrir un soutien pour le nouveau protocole de transfert websocket des trucs? En supposant que le fait d'avoir à la fois le serveur d'application et le serveur websocket à l'écoute sur le port 80 est une exigence, peut-être que dire que je Mince en cours d'exécution sur un serveur distinct, sans nginx en frontal pour l'instant?

Merci d'avance pour tout conseil ou suggestion. :)

-Jean

26voto

mloughran Points 3901

Vous ne pouvez pas utiliser nginx pour le moment[il n'est pas vrai non plus, mais je suggère de regarder à HAProxy. Je l'ai utilisé pour exactement cet effet.

Le truc est de mettre en longs délais d'attente, de sorte que les connexions socket ne sont pas fermées. Quelque chose comme:

timeout client  86400000 # In the frontend
timeout server  86400000 # In the backend

Si vous voulez servir le dire rails et des crampes d'application sur le même port, vous pouvez utiliser des règles ACL pour détecter une connexion websocket et utiliser un autre serveur. Si votre haproxy frontend config ressemblerait à quelque chose comme

frontend all 0.0.0.0:80
  timeout client    86400000
  default_backend   rails_backend
  acl websocket hdr(Upgrade)    -i WebSocket
  use_backend   cramp_backend   if websocket

Pour être complet le backend ressemblerait

backend cramp_backend
  timeout server  86400000
  server cramp1 localhost:8090 maxconn 200 check

12voto

yaoweibin Points 121

Comment utiliser mon module nginx_tcp_proxy_module ?

Ce module est conçu pour le proxy TCP général avec Nginx. Je pense que c'est aussi approprié pour websocket. Et je viens d'ajouter tcp_ssl_module dans la branche développement.

11voto

mak Points 5715

nginx (> = 1.3.13) prend désormais en charge les serveurs Web inversés.

 # the upstream server doesn't need a prefix! 
# no need for wss:// or http:// because nginx will upgrade to http1.1 in the config below
upstream app_server {
    server localhost:3000;
}

server {
    # ...

    location / {
        proxy_pass http://app_server;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        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_redirect off;
    }
}
 

7voto

Alexander Azarov Points 6630

Hors de la boîte (c'est à dire des sources officielles) de Nginx peut établir que HTTP 1.0 connexions en amont (=backend), ce qui signifie pas de keepalive est possibe: Nginx va sélectionner un serveur en amont, d'ouvrir une connexion à elle, proxy cache (si vous voulez) et fermer la connexion. C'est tout.

C'est la raison fondamentale de cadres nécessitant des connexions persistantes à l'arrière-plan ne fonctionnerait pas par le biais de Nginx (pas de HTTP/1.1 = pas de keepalive et pas les websockets, je suppose). Malgré cet inconvénient, il y a un avantage évident: Nginx pouvez choisir parmi plusieurs amonts (équilibrage de charge) et le basculement vers vivant dans le cas où certains d'entre eux ont échoué.

Edit: Nginx supporte le protocole HTTP 1.1 pour les backends & keepalive depuis la version 1.1.4. "fastcgi" et "proxy" amonts sont pris en charge. Ici c'est les docs

5voto

Pour ceux qui s’interrogent sur le même problème, nginx prend désormais officiellement en charge HTTP 1.1 en amont. Consultez la documentation nginx pour "keepalive" et "proxy_http_version 1.1".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X