Exécution d'un serveur WebSocket et d'un serveur http sur le même serveur


8

J'utilise nginx pour servir une instance d'application PHP, et en même temps j'exécute une application Ratchet pour écouter une connexion websocket. Le problème est que ces deux instances utilisent le même port (80).

Comment configurer le serveur pour pouvoir servir les deux?

Edit: Je suis juste revenu pour voir que la question a été rejetée plusieurs fois, c'est compréhensible, je n'ai pas vraiment posé la question de manière claire. Je m'excuse pour cela. J'ai fait ma diligence raisonnable. Je vais essayer de clarifier ce que je demandais, j'ai peut-être mal compris certains aspects du protocole websocket, auquel cas, veuillez me corriger:

Je sais bien qu'il ne peut y avoir qu'un seul processus à l'écoute d'un port particulier, ce que j'ai en fait un problème et c'est tout le Websocket, d'après ce que je comprends, une demande Websocket commence par une poignée de main HTTP, après quoi il y aura un mécanisme pour «mettre à niveau» cette session vers le port spécifique.

D'après ce que j'ai lu, il semble que ce mécanisme de mise à niveau soit géré par le serveur Web. Alors, comment puis-je configurer nginx pour gérer ce processus?

Dans l'ensemble, la seule chose qui m'inquiète concernant l'exécution du serveur Websocket sur un port autre que 80, est la possibilité que le port soit bloqué. Cette préoccupation n'est-elle pas fondée? Des conseils sur la façon dont je devrais configurer cela?


that_guy - veuillez consulter serverfault.com/help/how-to-ask - assurez-vous de faire preuve de diligence raisonnable avant de publier. Nous aimons que les gens posent des questions, mais nous aimons aussi que les gens fassent leurs devoirs.
ETL

Réponses:


16

Une question terriblement écrite, mais le terme que je cherchais était proxy inverse.

Fondamentalement, tout comme la façon dont nginx peut transférer différentes demandes vers plusieurs instances de l'application Web en fonction du chemin ou du nom d'hôte, il peut également être configuré pour «transférer» la demande vers une instance de serveur Websocket. par exemple:

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

upstream websocket{
    server localhost:8000;
}

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

Les requêtes HTTP à http://hostnameseront servies à la page html habituelle, tandis que la connexion websocket à wss://hostname/socketsera transmise à l'instance websocket sur le même serveur écoutant sur le port 8000.


Énorme aide !! Thanxx
gunjot singh

Une autre option utile à l' intérieur de ce bloc d'emplacement serait proxy_read_timeoutet proxy_write_timeoutpour éviter l'inactivité déconnexions.
Vi.

N'a pas résolu le problème d' aide nécessaire!
Nɪsʜᴀɴᴛʜ

2

Un serveur ne peut pas avoir deux logiciels différents à l'écoute sur le même port / la même adresse IP. Sinon, comment le trafic serait-il acheminé vers l'application XYZ si plusieurs applications pouvaient se lier au même port?

Vous pouvez en savoir plus sur les ports à partir de Port (mise en réseau informatique)

Ce que vous devez faire est l'une des options suivantes:

  1. Utilisez un port différent pour l'une des deux applications et autorisez cela à travers votre pare-feu.
  2. Utilisez deux adresses IP différentes - et liez chaque application à leurs adresses IP respectives.

Votre pare-feu doit simplement être configuré en fonction de ce que vous avez configuré.


pouvez-vous fournir plus d'informations? cela causerait-il un problème avec le pare-feu? est-ce que l'un des avantages de websocket est d'éviter cela?
hndr

5
Le partage de port est possible car vous pouvez avoir à la fois le serveur HTTP et le serveur Websocket en un seul processus.
Pacerier

0

Vous avez deux options:

  1. Lier un à un port différent (par exemple 8000)
  2. (si possible) ajoutez une adresse IP supplémentaire au serveur et liez le serveur web et le serveur websocket à différentes IP
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.