Ejecutar un servidor websocket y un servidor http en el mismo servidor


8

Estoy usando nginx para servir una instancia de aplicación PHP, y también al mismo tiempo ejecuto una aplicación Ratchet para escuchar una conexión websocket. El problema es que ambas instancias están utilizando el mismo puerto (80).

¿Cómo configuro el servidor para poder servir a ambos?

Editar: Acabo de volver a ver que la pregunta ha sido rechazada varias veces, comprensiblemente, realmente no hice la pregunta de una manera clara. Pido disculpas por eso. Sin embargo, hice mi diligencia debida. Trataré de aclarar lo que estaba preguntando, es posible que haya entendido mal algunos aspectos del protocolo websocket, en cuyo caso, corríjame:

Sé bien que solo puede haber un proceso escuchando un puerto en particular, lo que realmente tengo algún problema es entender todo el asunto del websocket, por lo que entiendo, una solicitud de websocket comienza con un protocolo de enlace HTTP, después del cual habrá un mecanismo para 'actualizar' esa sesión al puerto específico.

Por lo que leí, parece que este mecanismo de actualización es manejado por el servidor web. Entonces, ¿cómo configuro nginx para lidiar con este proceso?

Con todo, lo único que me preocupa de ejecutar el servidor websocket en un puerto que no sea 80, es la posibilidad de que el puerto esté bloqueado. ¿Es esta preocupación infundada? ¿Algún consejo sobre cómo debería configurar esto?


that_guy - por favor revise serverfault.com/help/how-to-ask - asegúrese de hacer su debida diligencia antes de publicar. Si bien nos gusta que la gente haga preguntas, también nos gusta que la gente haga su tarea.
ETL

Respuestas:


16

Una pregunta terriblemente escrita, pero el término que estaba buscando era proxy inverso.

Básicamente, al igual que nginx puede reenviar diferentes solicitudes a varias instancias de la aplicación web en función de la ruta o el nombre de host, también se puede configurar para "reenviar" la solicitud a una instancia de servidor websocket. p.ej:

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

Las solicitudes HTTP http://hostnameserán atendidas en la página html habitual, mientras que la conexión websocket wss://hostname/socketse enviará a la instancia de websocket en el mismo servidor que escucha en el puerto 8000.


Enorme ayuda !! Thanxx
gunjot singh

Otras opciones útiles dentro de ese bloque de ubicación serían proxy_read_timeouty proxy_write_timeoutpara evitar desconexiones por inactividad.
Vi.

¡No solucionó el problema que necesitaba ayuda!
Nɪsʜᴀɴᴛʜ

2

Un servidor no puede tener dos programas diferentes escuchando en el mismo puerto / dirección IP. De lo contrario, ¿cómo se enrutaría el tráfico a la aplicación XYZ si varias aplicaciones pudieran estar vinculadas al mismo puerto?

Puede obtener más información sobre los puertos desde el puerto (redes de computadoras)

Lo que debe hacer es una de las siguientes opciones:

  1. Use un puerto diferente para una de las dos aplicaciones y permita eso a través de su firewall.
  2. Use dos direcciones IP diferentes y vincule cada aplicación a sus respectivas direcciones IP.

Su firewall solo debe configurarse de acuerdo con lo que configuró.


¿Puedes proporcionar más información? ¿Eso causaría problemas con el firewall? ¿No es una de las ventajas de websocket evitar eso?
hndr

55
Es posible compartir el puerto, ya que puede tener el servidor HTTP y el servidor Websocket en un solo proceso.
Pacerier

0

Tienes dos opciones:

  1. Enlace uno a un puerto diferente (por ejemplo, 8000)
  2. (si es posible) agregue una dirección IP adicional al servidor y vincule el servidor web y el servidor websocket a diferentes IP
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.