¿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.

2 Solutions collect form web for “¿Cómo reenviar peticiones no-http en el puerto 80 a otro puerto?”

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 .

  • Configuración de DocumentRoot Virtual tanto para WWW como para WWW - SIN redirect
  • NGINX time de espera de authentication básico?
  • Muchas conexiones TIME_WAIT con nginx reverse-proxy
  • Nginx - Permitir el acceso al directorio de carpetas sólo mediante la URL de referencia
  • Limitar el acceso al subdominio en NGINX
  • ¿Por qué https://www.foobar.com se reorienta a sí mismo?
  • nginx rewrite no funciona, pero no sé por qué
  • ¿Debo usar nginx exclusivamente, o tenerlo como un proxy para Tomcat (relacionado con el performance)?
  • ¿Podemos saltar a otra location desde un lugar en nginx?
  • nginx default SSL El host SNI sobrescribe los protocolos SSL
  • no puede cambiar root en nginx por alguna razón
  • Cómo obtener nginx para pasar HTTP_AUTHORIZATION encabezado a Apache
  • ¿Cómo include en la list blanca un agente de usuario para nginx?
  • El linux y los temas del servidor de Windows, como ubuntu, centos, apache, nginx, debian y consejos de red.