¿Cómo reenviar peticiones no-http en el puerto 80 a otro puerto?

Hay un servidor web nginx que escucha los puertos 80 y 443. Me gustaría procesar todas las peticiones http como de costumbre y reenviar todas las solicitudes no-http a otro puerto (por ejemplo, 1234).

Mi pregunta es muy similar a una respuesta ya en stackoverflow: ¿Es posible reenviar la solicitud de conexión NON-http a algún otro puerto en nginx? . Tal vez, no entiendo la respuesta más votada, pero cuando agrego algo como esto a nginx.conf:

stream { upstream backend { server example.com:1234; } server { listen 80; proxy_pass backend; } } 

Tengo el error (esperado) bind() to 0.0.0.0:80 failed (98: Address already in use) error.

Nginx sólo puede proporcionar un tipo de servicio a un puerto al mismo tiempo.

Por lo tanto, esta configuración funcionará:

 http { server { listen 80; server_name example.com; ... } } stream { server { listen 81; proxy_pass backend; } upstream backend { server 127.0.0.1:12345; } } 

No puede utilizar el mismo puerto en bloques de stream y http , ya que nginx no tiene forma de distinguir el tipo de tráfico.

Como @AlexeyTen mencionado en su comentario, sslh es la herramienta adecuada para este propósito. Tiene soporte integrado para protocolos HTTP, SSL, SSH, OpenVPN, tinc y XMPP y también soporta pruebas de regex personalizadas.

Por ejemplo, para hacer que sslh envíe peticiones http a nginx, y las peticiones no-http a ejabberd, es suficiente para reemplazar en todos los hosts virtuales de nginx

  listen 80; 

con

  listen 127.0.0.1:88; 

( También es posible usar listen 127.0.0.1:80 si sslh con escuchar el puerto 80 en ip específico, o para usar, por ejemplo, listen 88 ), luego instalar sslh y editar sus opciones por defecto:

 RUN=yes DAEMON_OPTS="--numeric --user sslh --listen 0.0.0.0:80 --http 127.0.0.1:88 --xmpp 127.0.0.1:5222 --pidfile /var/run/sslh/sslh.pid" 

( /etc/default/sslh en debian). Y, por último, sólo (re) iniciar los servicios:

 systemctl restart nginx systemctl start sslh 

Si --transparent opción de sslh es necesario, habría algunos pasos adicionales – que están bien documentados en github .

    Intereting Posts