web-dev-qa-db-fra.com

Socket.io avec nginx

J'essaie de servir des fichiers statiques avec nginx 1.6 et d'utiliser le trafic de socket proxy provenant du serveur Web Node.js avec socket.io. 

Voici la partie pertinente de nginx.conf:

location /socket.io/ {
            proxy_pass http://localhost:3000;       
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_set_header Host $Host;
        }

Cela fonctionne parfaitement directement entre le navigateur et Node.js, mais socket.io prend trop de temps quand proxy avec nginx 1.6. Un protocole de négociation prend trop de temps, mais s'il reste ininterrompu, il commence finalement à fonctionner après quelques minutes.

La livraison de fichiers statiques par nginx fonctionne parfaitement.

Quel pourrait être le problème?

METTRE À JOUR:

J'ai analysé un peu le trafic réseau et déterminé que la requête suivante dure environ une minute (c'est exactement le moment où la mise à niveau est demandée):

Sec-WebSocket-Key: LhZ1frRdl+myuwyR/T03lQ==
Cookie: io=1-A7tpvwmoGbrSvTAAA5
Connection: keep-alive, Upgrade
Upgrade: websocket
....

La réponse attendue est code 101 et:

Connection: upgrade
Sec-WebSocket-Accept: HXx3KKJadQYjDa11lpK5y1nENMM=
Upgrade: websocket
...

au lieu de cela, le navigateur reçoit 400 et:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:8888
Connection: keep-alive
Content-Type: application/json
Server: nginx/1.6.2
Transfer-Encoding: chunked

MISE À JOUR 2:

J'ai déterminé que la même configuration fonctionnait parfaitement sur mon ordinateur de bureau, ce qui signifie que c'est mon problème d'ordinateur à la maison. Quoi qu'il en soit, il serait très agréable de déterminer ce qui ne va pas exactement.

13
Aleks

Sur un serveur en fonctionnement, la configuration de nginx utilisée ici est la suivante:

  # Requests for socket.io are passed on to Node on port 3000
  location ~* \.io {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_Host;
      proxy_set_header X-NginX-Proxy true;

      proxy_pass http://localhost:3000;
      proxy_redirect off;

      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
    }
45

Tous les exemples que j'ai vus ( Nginx docs , Nginx blog ) utilisent:

proxy_set_header Connection "upgrade";

Notez toutes les "mises à jour" minuscules. Votre exemple a un "U" majuscule. Cela vaut peut-être la peine d'essayer.

1
Sam Bauers

Vous avez peut-être oublié proxy_redirect off;

location / {
            proxy_pass http://localhost:3000/;
            include proxy_params;
            proxy_redirect off;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
    }
0
Radu Toader