Esecuzione di un server websocket e di un server http sullo stesso server


8

Sto usando nginx per servire un'istanza dell'applicazione PHP, e allo stesso tempo eseguo un'app Ratchet per ascoltare una connessione websocket. Il problema è che entrambe queste istanze utilizzano la stessa porta (80).

Come si configura il server in modo da poter servire entrambi?

Modifica: Sono appena tornato per vedere che la domanda è stata sottoposta a downgrade più volte, comprensibilmente, non ho fatto la domanda in modo chiaro. Mi scuso per quello. Ho fatto la mia dovuta diligenza però. Cercherò di chiarire cosa stavo chiedendo, potrei aver frainteso alcuni aspetti del protocollo websocket, nel qual caso, per favore, correggimi:

So bene che può esserci solo un processo in ascolto di una determinata porta, quello che sto effettivamente avendo qualche problema alla base è l'intera cosa del websocket, da quello che capisco, una richiesta del websocket inizia con una stretta di mano HTTP, dopo di che ci sarà un meccanismo per "aggiornare" quella sessione alla porta specifica.

Da quello che ho letto, sembra che questo meccanismo di aggiornamento sia gestito dal server web. Quindi, come configuro nginx per gestire questo processo?

Tutto sommato, l'unica cosa che mi preoccupa nell'esecuzione del server websocket su una porta diversa da 80 è la possibilità che la porta venga bloccata. Questa preoccupazione è infondata? Qualche consiglio su come dovrei configurarlo?


that_guy - per favore, consulta serverfault.com/help/how-to-ask - assicurati di fare la dovuta diligenza prima di pubblicare. Mentre a noi piacciono le persone che fanno domande, ci piace anche che le persone facciano i compiti.
ETL,

Risposte:


16

Una domanda terribilmente scritta, ma il termine che cercavo era delega inversa.

Fondamentalmente, proprio come il modo in cui nginx può inoltrare richieste diverse a diverse istanze dell'app Web in base al percorso o al nome host, può anche essere configurato per "inoltrare" la richiesta a un'istanza del server websocket. per esempio:

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;
}

Le richieste HTTP a http://hostnameverranno servite nella normale pagina html, mentre la connessione a websocket wss://hostname/socketverrà inoltrata all'istanza di websocket sullo stesso server in ascolto sulla porta 8000.


Enorme aiuto !! Thanxx
gunjot singh,

Altre opzioni utili all'interno di quel blocco di posizione sarebbero proxy_read_timeoute proxy_write_timeoutper impedire le disconnessioni inattività.
Vi.

Non ho risolto il problema con l' aiuto necessario!
Nɪsʜᴀɴᴛʜ

2

Un server non può avere due software diversi in ascolto sulla stessa porta / indirizzo IP. Altrimenti, come verrebbe instradato il traffico all'Applicazione XYZ se più applicazioni potessero essere associate alla stessa porta?

Puoi saperne di più sulle porte da Port (rete di computer)

Quello che devi fare è una delle seguenti opzioni:

  1. Utilizzare una porta diversa per una delle due applicazioni e consentirla attraverso il firewall.
  2. Utilizza due indirizzi IP diversi e associa ciascuna applicazione ai rispettivi indirizzi IP.

Il tuo firewall deve solo essere configurato in base a ciò che hai impostato.


puoi fornire maggiori informazioni? ciò causerebbe problemi con il firewall? non è uno dei vantaggi di websocket è quello di evitarlo?
hndr,

5
La condivisione della porta è possibile poiché è possibile avere sia il server HTTP che il server Websocket in un unico processo.
Pacerier,

0

Hai due opzioni:

  1. Associare uno a un'altra porta (ad esempio 8000)
  2. (se possibile) aggiungere un indirizzo IP aggiuntivo al server e associare il server Web e il server Web a diversi IP
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.