GNU/Linux >> Tutoriales Linux >  >> Linux

Uso de Docker para configurar Nginx Reverse Proxy con generación automática de SSL

¿Qué es el proxy inverso? ¿Cuáles son sus ventajas?

¿Qué es un proxy inverso? El proxy inverso es una especie de servidor que se encuentra al frente de muchos otros servidores y reenvía las solicitudes de los clientes a los servidores apropiados. La respuesta del servidor también es recibida y enviada por el servidor proxy al cliente.

¿Por qué usarías una configuración así? Hay varias buenas razones para ello. Esta configuración se puede usar para configurar un balanceador de carga, almacenamiento en caché o para protección contra ataques.

No voy a entrar en detalles aquí. En su lugar, le mostraré cómo puede utilizar el concepto de proxy inverso para configurar varios servicios en el mismo servidor.

Toma la misma imagen que la que viste arriba. Lo que puede hacer es ejecutar un servidor Ngnix en un contenedor docker en modo proxy inverso. Otros servicios web también se pueden ejecutar en sus propios contenedores respectivos.

El contenedor Nginx se configurará de manera que sepa qué servicio web se está ejecutando en qué contenedor.

Esta es una buena manera de ahorrar el costo de hospedar cada servicio en un servidor diferente. Puede tener varios servicios ejecutándose en el mismo servidor Linux gracias al servidor proxy inverso.

Configurar Nginx como proxy inverso para implementar múltiples servicios en el mismo servidor usando Docker

Déjame mostrarte cómo configurar la configuración mencionada anteriormente.

Con estos pasos, puede instalar varios contenedores de aplicaciones basados ​​en la web que se ejecutan en Nginx con cada contenedor independiente correspondiente a su propio dominio o subdominio respectivo.

Primero, veamos qué necesitas para seguir este tutorial.

Requisitos

Necesitará los siguientes conocimientos para comenzar fácilmente con este tutorial. Aunque también puedes arreglártelas sin ellos.

  • Un sistema/servidor Linux. Puede implementar fácilmente un servidor Linux en minutos utilizando el servicio en la nube de Linode.
  • Familiarizarse con los comandos y la terminal de Linux.
  • Conocimientos básicos de Docker.
  • Debe tener Docker y Docker Compose instalados en su servidor Linux. Lea nuestra guía sobre la instalación de Docker y Docker Compose en CentOS.
  • También debe poseer un dominio (para que pueda configurar servicios en subdominios).

He usado domain.com como nombre de dominio de ejemplo en el tutorial. Asegúrese de cambiarlo según sus propios dominios o subdominios.

Además de lo anterior, asegúrese también de lo siguiente:

Cambia los registros DNS de tu dominio

En el panel de registro A/AAAA o CNAME de su proveedor de nombre de dominio, asegúrese de que tanto el dominio como los subdominios (incluido www) apunten a la dirección IP de su servidor.

Este es un ejemplo para su referencia:

Intercambiar espacio

Para asegurarse de que todas las aplicaciones de su contenedor estén cómodas y nunca se queden sin memoria después de implementarlas, debe tener el espacio de intercambio necesario en su sistema.

Siempre puede ajustar el intercambio de acuerdo con la RAM disponible en su sistema. Puede decidir el espacio de intercambio en función del paquete de contenedores de aplicaciones en el servidor único y estimar su uso de RAM acumulativo.

Paso 1:configurar el contenedor de proxy inverso de Nginx

Comience con la configuración de su proxy inverso nginx. Cree un directorio llamado "reverse-proxy" y cambie a él:

mkdir reverse-proxy && cd reverse-proxy

Cree un archivo llamado docker-compose.yml , ábralo en su editor de texto basado en terminal favorito como Vim o Nano.

Para el proxy inverso nginx, usaré la imagen jwilder/nginx-proxy. Copie y pegue lo siguiente en el archivo docker-compose.yml:

version: "3.7"

services:

    reverse-proxy:
        image: "jwilder/nginx-proxy:latest"
        container_name: "reverse-proxy"
        volumes:
            - "html:/usr/share/nginx/html"
            - "dhparam:/etc/nginx/dhparam"
            - "vhost:/etc/nginx/vhost.d"
            - "certs:/etc/nginx/certs"
            - "/run/docker.sock:/tmp/docker.sock:ro"
        restart: "always"
        networks: 
            - "net"
        ports:
            - "80:80"
            - "443:443"

Ahora repasemos las partes importantes del archivo de redacción:

  • Ha declarado cuatro volúmenes, html, dhparam, vhost y certs. Son datos persistentes que definitivamente querrá conservar incluso después de que el contenedor haya estado inactivo. El html &vhost Los volúmenes serán muy importantes en la próxima implementación del contenedor Let's Encrypt. Están diseñados para trabajar juntos.
  • El docker socker está montado en modo de solo lectura dentro del contenedor. Este es necesario para que el contenedor del proxy inverso genere los archivos de configuración de nginx, detecte otros contenedores con una variable de entorno específica.
  • La política de reinicio de Docker está establecida en always . Otras opciones incluyen on-failure y unless-stopped . En este caso, siempre me pareció más adecuado.
  • Los puertos 80 y 443 están vinculados al host para http y https respectivamente.
  • Por último, utiliza una red diferente, no la red puente predeterminada.
Usar una red definida por el usuario es muy importante. Esto ayudará a aislar todos los contenedores que van a ser enviados por proxy, además de permitir que el contenedor de proxy inverso reenvíe a los clientes a sus contenedores deseados/intencionados y también permita que los contenedores se comuniquen entre sí (lo que no es posible con la red de puente predeterminada a menos que icc se establece en true para el demonio).

Tenga en cuenta que YML es muy quisquilloso con las tabulaciones y la sangría.

Paso 2:Configure un contenedor para la generación automática de certificados SSL

Para esto, puede usar la imagen del contenedor jrcs/letsencrypt-nginx-proxy-companion.

En el mismo docker-compose.yml archivo que usó antes, agregue las siguientes líneas:

    letsencrypt:
        image: "jrcs/letsencrypt-nginx-proxy-companion:latest"
        container_name: "letsencrypt-helper"
        volumes:
            - "html:/usr/share/nginx/html"
            - "dhparam:/etc/nginx/dhparam"
            - "vhost:/etc/nginx/vhost.d"
            - "certs:/etc/nginx/certs"
            - "/run/docker.sock:/var/run/docker.sock:ro"
        environment:
            NGINX_PROXY_CONTAINER: "reverse-proxy"
            DEFAULT_EMAIL: "[email protected]"
        restart: "always"
        depends_on:
            - "reverse-proxy"
        networks: 
            - "net"

En esta definición de servicio:

  • Está utilizando exactamente los mismos volúmenes que utilizó para el contenedor de proxy inverso. El html y vhost el intercambio de volúmenes es necesario para que el Desafío ACME de letsencrypt tenga éxito. Este contenedor generará los certificados dentro de /etc/nginx/certs , en el contenedor. Es por eso que está compartiendo este volumen con su contenedor de proxy inverso. El dhparam El volumen contendrá el archivo dhparam. El socket está montado para detectar otros contenedores con una variable de entorno específica.
  • Aquí ha definido dos variables de entorno. El NGINX_PROXY_CONTAINER variable apunta al contenedor de proxy inverso. Establézcalo en el nombre del contenedor. El DEFAULT_EMAIL es el correo electrónico que se utilizará al generar los certificados para cada dominio/subdominio.
  • El depends_on La opción está configurada para que este servicio espere a que el proxy inverso se inicie primero, luego, y solo entonces, se iniciará.
  • Por último, este contenedor también comparte la misma red. Esto es necesario para que los dos contenedores se comuniquen.

Paso 3:finalice el archivo de composición de docker

Una vez que haya terminado con las definiciones del servicio, complete el archivo docker-compose con las siguientes líneas:

volumes:
  certs:
  html:
  vhost:
  dhparam:

networks:
  net:
    external: true

La red net está configurado como externo porque los contenedores con proxy también tendrán que usar esta red. Y si dejamos que la red sea creada por docker-comspose , el nombre de la red dependerá del directorio actual. Esto creará una red con un nombre extraño.

Aparte de eso, otros contenedores tendrán que configurar esa red para que sea externa de todos modos, de lo contrario, esos archivos compuestos también tendrán que residir en este mismo directorio, ninguno de los cuales es ideal.

Por lo tanto, cree la red usando

 docker network create net

El siguiente es el contenido completo de docker-compose.yml archivo.

version: "3.7"

services:

    reverse-proxy:
        image: "jwilder/nginx-proxy:latest"
        container_name: "reverse-proxy"
        volumes:
            - "html:/usr/share/nginx/html"
            - "dhparam:/etc/nginx/dhparam"
            - "vhost:/etc/nginx/vhost.d"
            - "certs:/etc/nginx/certs"
            - "/run/docker.sock:/tmp/docker.sock:ro"
        restart: "always"
        networks: 
            - "net"
        ports:
            - "80:80"
            - "443:443"
    letsencrypt:
        image: "jrcs/letsencrypt-nginx-proxy-companion:latest"
        container_name: "letsencrypt-helper"
        volumes:
            - "html:/usr/share/nginx/html"
            - "dhparam:/etc/nginx/dhparam"
            - "vhost:/etc/nginx/vhost.d"
            - "certs:/etc/nginx/certs"
            - "/run/docker.sock:/var/run/docker.sock:ro"
        environment:
            NGINX_PROXY_CONTAINER: "reverse-proxy"
            DEFAULT_EMAIL: "[email protected]"
        restart: "always"
        depends_on:
            - "reverse-proxy"
        networks: 
            - "net"
volumes:
  certs:
  html:
  vhost:
  dhparam:

networks:
  net:
    external: true

Finalmente, puede implementar estos dos contenedores (Ngnix y Let's Encrypt) usando el siguiente comando:

docker-compose up -d

Paso 4:Verificar que el proxy inverso de Ngnix esté funcionando

El contenedor que servirá la interfaz deberá definir dos variables de entorno.

VIRTUAL_HOST :para generar la configuración del proxy inverso

LETSENCRYPT_HOST :para generar los certificados necesarios

Asegúrese de tener los valores correctos para estas dos variables. Puede ejecutar una imagen ficticia de nginx con un proxy inverso como este:

docker run --rm --name nginx-dummy -e VIRTUAL_HOST=sub.domain.com -e LETSENCRYPT_HOST=sub.domain.com -e VIRTUAL_PORT=80 --network net -d nginx:latest

Ahora, si va a su subdominio utilizado en el comando anterior, debería ver un mensaje del servidor Ngnix.

Una vez que lo haya probado con éxito, puede detener el contenedor docker en ejecución:

docker stop nginx-dummy

También puede detener el proxy inverso de Ngnix si no lo va a utilizar:

docker-compose down

Paso 5:ejecutar otros contenedores de servicios con proxy inverso

El proceso de configurar otros contenedores para que puedan ser enviados por proxy es MUY simple.

Lo mostraré con dos instancias de implementación de Nextcloud en un momento. Déjame primero decirte lo que estás haciendo aquí.

No vincular a ningún puerto

El contenedor puede omitir el puerto que sirve al frontend. El contenedor de proxy inverso lo detectará automáticamente.

(OPCIONAL) Definir PUERTO_VIRTUAL

Si el contenedor del proxy inverso no detecta el puerto, puede definir otra variable de entorno llamada VIRTUAL_PORT con el puerto que da servicio a la interfaz o cualquier servicio que desee obtener proxy, como "80" o "7765".

Configurar el correo electrónico de Let's Encrypt específico para un contenedor

Puede anular el DEFAULT_EMAIL variable y establezca una dirección de correo electrónico específica para un certificado de dominio/subdominio de contenedor/servicio web específico, configurando la identificación del correo electrónico en la variable de entorno LETSENCRYPT_EMAIL . Esto funciona por contenedor.

Ahora que sabe todo eso, permítame mostrarle el comando que implementa una instancia de Nextcloud que se transmitirá mediante el contenedor de proxy nginx y tendrá TLS (SSL/HTTPS) habilitado.

Esta NO ES UNA implementación IDEAL. El siguiente comando se usa solo con fines demostrativos.
docker run --name nextcloud --network net -e VIRTUAL_HOST="sub0.domain.com" -e LETSENCRYPT_HOST="sub0.domain.com" -d nextcloud:19.0.2

En el ejemplo, usó la misma red que los contenedores de proxy inverso, definió las dos variables de entorno, con los subdominios apropiados (Establezca el suyo según corresponda). Después de un par de minutos, debería ver Nextcloud ejecutándose en sub0.domain.com. Ábralo en un navegador para verificarlo.

Puede implementar otra instancia de Nextcloud como esta, en un subdominio diferente, como el siguiente:

docker run --name anothernextcloud --network net -e VIRTUAL_HOST="sub1.domain.com" -e LETSENCRYPT_HOST="sub1.domain.com" -d nextcloud:19.0.2

Ahora debería ver una instancia diferente de Nextcloud ejecutándose en un subdominio diferente en el mismo servidor.

Con este método, puede implementar diferentes aplicaciones web en el mismo servidor servido bajo diferentes subdominios, lo cual es bastante útil.

Seguir

Ahora que tiene esto configurado, puede continuar y usarlo en implementaciones reales con los siguientes ejemplos:

  • Instalar Matrix Synapse Homeserver usando Docker
  • Instalar varios contenedores de discursos en el mismo servidor

Para obtener más artículos como estos, suscríbase a nuestro boletín o considere convertirse en miembro. Para cualquier consulta, no dude en comentar a continuación.


Linux
  1. Cómo configurar un proxy inverso Nginx

  2. Una guía para ejecutar un proxy inverso para HTTP(S), SSH y MySQL/MariaDB usando NGINX

  3. Proxy inverso con Nginx:una guía de configuración paso a paso

  4. Cómo configurar Nginx como proxy inverso en Ubuntu 20.04

  5. Configurar Nginx como proxy inverso en Ubuntu 20.04 - ¿Guía paso a paso?

Cómo instalar GlassFish Java Server con Nginx como proxy inverso en Debian 11

Instale Plex Media Server en Debian 11 Bullseye con Nginx Reverse Proxy

Cómo configurar Nginx con soporte HTTP/2 en Ubuntu 18.04

Cómo configurar un servidor Seafile con Nginx en Ubuntu 18.04

Cómo configurar Tomcat con Nginx como proxy inverso en Ubuntu 18.04

Cómo instalar NGINX como proxy inverso para Apache en Ubuntu 18.04

    Nombre de host Dirección IP TTL
    dominio.com 172.105.50.178 Predeterminado
    * 172.105.50.178 Predeterminado
    sub0.dominio.com 172.105.50.178 Predeterminado
    sub1.dominio.com 172.105.50.178 Predeterminado