Nginx proxy inverso

Nginx proxy inverso

¿Qué es un proxy inverso??

Un servidor proxy es el que habla con Internet en su nombre. Por ejemplo, si la red de su universidad ha bloqueado https: // www.Facebook.com/pero el dominio https: // EjemploProxy.COM sigue siendo accesible, luego puede visitar este último y reenviará todas sus solicitudes de servidores de Facebook a Facebook, y enviará las respuestas de Facebook a su navegador.

Para recapitular, un proxy envía solicitudes en nombre de uno de los más clientes a cualquier servidor en Internet. Un proxy inverso se comporta de manera similar.

A proxy inverso recibe solicitud de todos y cada uno de los clientes en nombre de uno o más servidor. Entonces, si tienes un par de servidores alojando la Primera Guerra Mundial.ejemplo.com y ww2.ejemplo.com un servidor proxy inverso puede aceptar solicitudes en nombre de los dos servidores, reenviar esas solicitudes a sus respectivos puntos finales donde se genera la respuesta y se devuelve al proxy inverso para volver a los clientes.

La puesta en marcha

Antes de comenzar a ajustar archivos de configuración Nginx y hacer un servidor proxy inverso. Quiero poner en piedra cómo se ve mi configuración, así que cuando intentes implementar tu diseño, sería menos confuso.

Utilicé la plataforma de DigitalOcean para girar tres VPS. Todos están en la misma red cada uno con su propia IP privada, y solo un VPS tiene una IP pública estática (este será nuestro servidor proxy inverso.)

VM/nombre de host IP privada IP público Role
Proxietre 10.135.123.187 159.89.108.14 Proxy inverso, ejecutando nginx
Nodo-1 10.135.123.183 N / A Ejecutando el primer sitio web
Nodo-2 10.135.123.186 N / A Ejecutando el segundo sitio web

Los dos sitios web diferentes que se ejecutan tienen nombres de dominio WW1.ranvirslog.comunicarse y Segunda Guerra Mundial.ranvirslog.comunicarse Y ambos registros apuntan a la IP pública del proxy de reverso, yo.E, 159.89.108.14

La idea detrás de la IP privada es que las tres máquinas virtuales pueden hablar entre sí a través de esta IP privada, pero un usuario remoto solo puede acceder a la VM proxy inversa en su IP pública. Esto es importante tener en cuenta. Por ejemplo, no puede SSH en ninguna de las VM utilizando su IP privada.

Además, tanto el nodo-1 como el nodo-2 tienen un servidor web Apache que sirve dos páginas web distintas. Esto nos ayudará a distinguir uno de otro.

El primer sitio web dice "Funciona el sitio web 1!!!"

Del mismo modo, el segundo sitio web muestra esto:

Sus sitios web pueden diferir, pero si desea replicar esta configuración como punto de partida, ejecute APT instalar apache2 en el nodo-1 y el nodo-2. Luego edite el archivo/var/www/html/index.html para que el servidor web diga lo que quiera que diga.

La VM de reverso todavía no se ha tocado. Todas las máquinas virtuales están ejecutando Ubuntu 18.04 LTS, pero es libre de usar cualquier otro sistema operativo que desee. Incluso puedes emular esto usando contenedores Docker. Al crear una red Docker Bridge definida por el usuario y los contenedores de desove en ella, puede asignar a cada contenedor una IP privada y reenviar todo el proxy HTTP/HTTPS a un contenedor, que sería nuestro contenedor de proxy inverso NGINX.

Hasta ahora, todo bien.

Configuración predeterminada de Nginx

Comencemos por instalar Nginx en el servidor ReverseProxy, estoy usando Ubuntu, por lo que APT es mi administrador de paquetes:

$ sudo apt install nginx

Eliminar la configuración predeterminada si está utilizando la distribución basada en Debian

Antes de ir más allá, una pequeña nota sobre la configuración de Nginx. Todos los diversos archivos de configuración se almacenan en /etc /nginx, incluido el NGINX.archivo conf que es el archivo de configuración principal. Si observamos el contenido de este archivo (dentro del bloque HTTP), notará las siguientes dos líneas:


incluir/etc/nginx/conf.d/*.conf;
incluir/etc/nginx/sites-habilitado/*;

La segunda línea incluye todos los archivos en el directorio habilitado para sitios a la configuración de Nginx. Esta es la práctica estándar en la mayoría de las distribuciones basadas en Debian. Por ejemplo, la página web predeterminada "Bienvenido a NGINX" tiene un archivo correspondiente llamado predeterminado en la ubicación/etc/nginx/sites-disponible/predeterminado con un enlace simbólico a/etc/nginx/sites habilitado/, pero no necesitamos esto Página web predeterminada para que podamos eliminar el enlace simbólico de forma segura. El original todavía está disponible en el directorio disponible en los sitios.

$ rm/etc/nginx/sites-habilitado/predeterminado

Pero cuando creemos una configuración de proxy inversa, lo haremos en conf.D Directory (con nuestro nombre de archivo tiene un .extensión conf) esto es universal, y trabaja en todas las distribuciones no solo Debian o Ubuntu.

Eliminar la configuración predeterminada para otras distribuciones

Si no está utilizando Distro basada en Debian, encontrará el valor predeterminado Pagina de bienvenida Configuración AT/ETC/NGINX/conf.d/predeterminado.Conf solo mueva el archivo a algún lugar seguro si desea usarlo en el futuro (ya que este no es un enlace simbólico)

$ mv/etc/nginx/conf.d/predeterminado.conf ~/predeterminado.confusión

A veces se puede encontrar en/etc/nginx/predeterminado.D porque la gente simplemente no puede estar de acuerdo con un solo estándar simple! Entonces tendría que cavar un poco en el directorio /etc /nginx, para resolver esto.

Agregar bloques de proxy inverso

Como se indicó anteriormente, los dos nombres de dominio diferentes que estoy alojando detrás de este proxy son

  1. ranvirslog.com (sitio web 1) con IP 10.135.123.183
  2. ranvirslog.com (sitio web 2) con IP 10.135.123.186

Entonces, creemos un archivo por sitio web en/etc/nginx/conf.D/ carpeta. Entonces estamos bien organizados.

$ touch/etc/nginx/conf.D/WW1.confusión
$ touch/etc/nginx/conf.d/ww2.confusión

Puede nombrar los archivos lo que desee, siempre que tenga un .conf al final de su nombre.

En el primer archivo ww1.Conf. Agregue las siguientes líneas:

servidor
Escucha 80;
escuchar [::]: 80;
server_name ww1.ranvirslog.com;
ubicación /
proxy_pass http: // 10.135.123.183/;
proxy_buffering off;
proxy_set_header X-Real-IP $ Remote_addr;

Las declaraciones de escucha le dicen a NGINX que escuche en el puerto 80 para los casos IPv4 e IPv6. Luego verifica si el SERVER_NAME es WW1.ranvirslog.com entonces el bloque de ubicación entra y proxies la solicitud a http: // 10.135.123.183/ con Buffering apagado. Además, la línea proxy_set_header ... asegura que la IP original del cliente se reenvía al servidor proxied. Esto es útil en caso de que desee calcular el número de visitantes únicos, etc. De lo contrario, el servidor proxy tendría solo un visitante: el servidor NGINX.

La opción de almacenamiento en búfer y las opciones set_header son completamente opcionales y solo se agregan para que el proxying sea lo más transparente posible. Para la Primera Guerra Mundial.ranvirslog.COM Sitio web, agregué la siguiente configuración en/etc/nginx/conf.d/ww2.conf:

servidor
Escucha 80;
escuchar [::]: 80;
server_name ww2.ranvirslog.com;
ubicación /
proxy_pass http: // 10.135.123.186/;
proxy_buffering off;
proxy_set_header X-Real-IP $ Remote_addr;

Guarde los archivos y pruebe si la configuración general es válida o no:

$ sudo nginx -t

Si hay errores, la salida del comando anterior lo ayudará a encontrarlos y solucionarlos. Ahora reinicie el servidor:

$ servicio nginx reiniciar

Y puede probar si funcionó o no visitando los diferentes nombres de dominio en su navegador y viendo el resultado.

Conclusión

El caso de uso de cada individuo es diferente. La configuración mencionada anteriormente puede necesitar un poco de ajuste para funcionar para su escenario. Tal vez esté ejecutando múltiples servidores en el mismo host, pero en diferentes puertos, en ese caso, la línea proxy_pass ... tendrá http: // localhost: portnumber/como su valor.

Estos detalles dependen mucho de su caso de uso. Para obtener más detalles sobre otras opciones y Tuneables, consulte los documentos oficiales de Nginx.