Cómo instalar y utilizar el gestor de proxy Nginx con Docker

Pantalla de inicio de sesión del Administrador de Proxy Nginx

Un proxy inverso es un servidor web que puede situarse delante de otro servidor web o de un servicio web. Puede cifrar el tráfico saliente, actuar como equilibrador de carga, redirigir el tráfico y ofrecer protección. El servidor web Nginx puede utilizarse como servidor proxy frente a los servidores tradicionales, pero a veces su configuración puede ser tediosa y causar problemas si no se hace correctamente.

Nginx Proxy Manager es una aplicación que facilita la configuración de Nginx como servidor proxy proporcionando una interfaz gráfica de usuario (GUI) con características como soporte SSL incorporado usando Let’s Encrypt, soporte para múltiples hosts, autenticación HTTP, listas de acceso y gestión de usuarios.

Este tutorial le enseñará cómo instalar el gestor de proxy Nginx en un servidor Linux usando Docker. Cubriremos todas las distribuciones populares de Linux en un solo tutorial.

Requisitos previos

  • Un servidor Linux con Ubuntu/Debian/CentOS/Alma Linux/Rocky Linux con un mínimo de 1 GB de RAM.
  • Un usuario no root con privilegios sudo.
  • Un nombre de dominio completo (FQDN) como npm.example.com que apunte al servidor.

Paso 1 – Configurar el Firewall

Cent OS/Rocky Linux/Alma Linux

Debería tener instalado el cortafuegos Firewalld. Compruebe el estado del cortafuegos.

$ sudo firewall-cmd --state
running

Abra los puertos 80, 81 y 443.

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
$ sudo firewall-cmd --permanent --add-port=81/tcp

Recargue el cortafuegos para activar los cambios.

$ sudo firewall-cmd --reload

Ubuntu/Debian

Los sistemas Ubuntu y Debian utilizan ufw (Uncomplicated Firewall) por defecto.

Compruebe si el cortafuegos se está ejecutando.

$ sudo ufw status

Si está funcionando, abra los puertos 80, 81 y 443.

$ sudo ufw allow 80
$ sudo ufw allow 81
$ sudo ufw allow 443

Abra el puerto SSH si el cortafuegos no se está ejecutando.

$ sudo ufw allow "OpenSSH"

Habilite el cortafuegos si no se está ejecutando.

$ sudo ufw enable

Si se está ejecutando, recárguelo para aplicar los cambios.

$ sudo ufw reload

Paso 2 – Instalar Docker

Cent OS/Rocky Linux/Alma Linux

Ejecute el siguiente comando para instalar Docker.

$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io

Ubuntu

$ sudo apt install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io

Debian

$ sudo apt install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io

Habilite e inicie el servicio Docker.

$ sudo systemctl start docker --now

Añada su nombre de usuario al grupo Docker.

$ sudo usermod -aG docker $USER

Salga del sistema y vuelva a entrar para aplicar el cambio.

Paso 3 – Instalar Docker Compose

Descargue e instale el binario de Docker Compose.

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Aplique el permiso de ejecución al binario.

$ sudo chmod +x /usr/local/bin/docker-compose

Paso 4 – Crear el archivo Docker Compose

Cree un directorio para el gestor de proxy Nginx.

$ mkdir ~/nginx-proxy

Cambiar al directorio.Anuncio

$ cd ~/nginx-proxy

Crear directorios para los datos del usuario y los certificados SSL.

$ mkdir {data,letsencrypt}

Cree y abra el archivo docker-compose.yml para editarlo.

$ nano docker-compose.yml

Pegue el siguiente código en él.

version: "3"
services:
  npm-app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: npm-app
    restart: unless-stopped
    ports:
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '21:21' # FTP
    environment:
      DB_MYSQL_HOST: "npm-db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"
      # Uncomment the line below if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    depends_on:
      - npm-db
    networks:
      - npm-nw
      - npm-internal

  npm-db:
    image: 'mariadb:latest'
    container_name: npm-db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - ./data/mysql:/var/lib/mysql
    networks:
      - npm-internal

networks:
  npm-internal:
  npm-nw:
    external: true

Guarde el archivo pulsando Ctrl + X e introduciendo Y cuando se le solicite.

Revisemos el archivo. La primera parte del archivo es donde importamos la imagen del gestor de proxy Nginx y establecemos algunas variables de entorno en forma de credenciales de la base de datos. También exponemos los puertos 80, 81 y 443 al servidor para el acceso. Puedes exponer más puertos, como el 21, para el acceso FTP. Puedes desactivar el soporte de IPV6 descomentando la línea DISABLE_IPV6: ‘true’. Hemos mapeado varios directorios de nuestro host al Docker para el almacenamiento de datos y SQL.

Estamos usando dos redes aquí. Una es la red interna npm-interna para conectar el gestor de proxy y la base de datos. Esta es opcional ya que se crea automáticamente. Pero aquí, lo estamos haciendo manualmente dándole un nombre de nuestra elección.

Hemos añadido una red externa al contenedor del gestor de proxy llamada npm-nw. Esta red es esencial porque puedes usarla para conectar el gestor de proxy a cualquier otro contenedor Docker que instales. El uso de una red le permitirá conectar cualquier contenedor directamente sin necesidad de exponer sus puertos al servidor.

Paso 5 – Ejecutar el Gestor de Proxy Nginx

Antes de lanzar el contenedor Docker, necesitamos crear la red externa npm-nw. Las redes internas se crean automáticamente. Ejecute el siguiente comando para crear la red externa.

$ docker network create npm-nw

Inicie el contenedor Docker con el siguiente comando.

$ docker-compose up -d

Compruebe el estado de los contenedores.

$ docker ps
CONTAINER ID   IMAGE                             COMMAND                  CREATED              STATUS              PORTS                                                                                  NAMES
c91ca0ddca97   jc21/nginx-proxy-manager:latest   "/init"                  About a minute ago   Up About a minute   0.0.0.0:80-81->80-81/tcp, :::80-81->80-81/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   npm-app
1738d71b95da   mariadb:latest                    "docker-entrypoint.s…"   About a minute ago   Up About a minute   3306/tcp                                                                               npm-db

Paso 6 – Acceder al Gestor de Proxy Nginx

Ahora puede acceder a su gestor de proxy Nginx a través de la URL http://yourserverIP:81. Debería obtener la siguiente pantalla de acceso.

Pantalla de inicio de sesión del Administrador de Proxy Nginx

Introduzca las siguientes credenciales por defecto para iniciar sesión.

Dirección de correo electrónico: [email protected] Contraseña: changeme

A continuación, se le pedirá inmediatamente que establezca un nombre y una dirección de correo electrónico.Anuncio

Nginx Proxy Manager Edit User Popup

Haga clic en el botón Guardar y se le pedirá que establezca una nueva contraseña.

Ventana emergente del Administrador de Proxy Nginx para establecer la contraseña

Haga clic en el botón Guardar y ya puede empezar a utilizar la aplicación.

Tablero del Administrador de Proxy Nginx

Si abre la URL http://yourserverIP en su navegador, será llevado a una página por defecto que el gestor de proxy ha establecido.

Sitio por defecto del gestor de proxy Nginx

Paso 7 – Configuración del nombre de dominio y SSL para el Administrador de Proxy Nginx

Establezcamos un nombre de dominio para acceder al Gestor de Proxy Nginx. Este paso es opcional, pero es útil si desea poner la aplicación detrás de SSL.

Haga clic en Hosts >> Proxy Hosts del menú del tablero para abrir la página de Hosts Proxy. Desde allí, haga clic en el botón Añadir host proxy para continuar.

Pantalla de nuevo host proxy de Nginx Proxy Manager

Añada el nombre FQDN (npm.ejemplo.com) y haga clic en él. Introduzca la dirección IP de su servidor y 81 como Puerto de reenvío.

Cambia a la pestaña SSL.

Nginx Proxy Manager Configurar SSL

Seleccione Solicitar un nuevo certificado SSL en el menú desplegable. Seleccione las opciones Forzar SSL y Soporte de HTTP/2. Si quieres habilitar HSTS, puedes habilitarlo también. Si tiene su dominio configurado a través de Cloudflare, no habilite la opción Forzar SSL de lo contrario, se quedará atascado en un bucle de redirección.

Introduzca su dirección de correo electrónico, acepte las condiciones de servicio de Let’s Encrypt y haga clic en el botón Guardar para terminar.

Lista de hosts proxy del gestor de proxies Nginx

Tu dominio debería estar activo y funcionando. Intente abrir https://npm.example.com en su navegador, y debería obtener la pantalla de inicio de sesión de Nginx Proxy Manager.

Puedes hacerlo de forma similar para la página de aterrizaje por defecto y asignarla a un nombre de dominio como https://example.com. Sólo tienes que cambiar el puerto de 81 a 81 mientras configuras el host proxy.

Paso 8 – Usar el Administrador de Proxy Nginx con otra aplicación web Docker

Ahora que hemos instalado el gestor de proxy, es el momento de darle algún uso. Lo primero que vamos a hacer es utilizarlo para alojar otra aplicación web Docker. Para ello, instalaremos el blog Ghost. Si quieres saber más, consulta nuestro tutorial sobre la instalación de Ghost usando Docker en un servidor Ubuntu.

Crea otro directorio para tu blog de Ghost.

$ mkdir ~/ghost

Cambia al directorio de Ghost.

$ cd ~/ghost

Cree dos directorios para el contenido y la base de datos.

$ mkdir {content,mysql}

Incluso si está usando la misma imagen de MySQL, debería mantener los datos y sus contenedores separados de los del gestor de Proxy. Esto ayudará a aislar cualquier problema que puedas encontrar y te permitirá mover cosas en caso de que lo necesites.

Cree y abra el archivo Docker compose para editarlo.

$ nano docker-compose.yml

Pegue el siguiente código. Sustituye example.com por el nombre de dominio real de tu blog Ghost. Introduce los datos SMTP si quieres recibir correos electrónicos. Puedes eliminarlos si no los necesitas.

version: '3.3'
services:

  ghost-app:
    image: ghost:latest
    container_name: ghost-app
    restart: always
    depends_on:
      - ghost-db
    environment:
      url: https://ghost.example.com
      database__client: mysql
      database__connection__host: ghost-db
      database__connection__user: ghost
      database__connection__password: ghostdbpass
      database__connection__database: ghostdb
      mail__transport: SMTP
      mail__options__host: {Your Mail Service host}
      mail__options__port: {Your Mail Service port}
      mail__options__secureConnection: {true/false}
      mail__options__service: {Your Mail Service}
      mail__options__auth__user: {Your User Name}
      mail__options__auth__pass: {Your Password}
    volumes:
      - /home/<username>/ghost/content:/var/lib/ghost/content
    networks:
      - npm-nw
      - ghost-network

  ghost-db:
    image: mariadb:latest
    container_name: ghost-db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_mysql_root_password
      MYSQL_USER: ghost
      MYSQL_PASSWORD: ghostdbpass
      MYSQL_DATABASE: ghostdb
    volumes:
      - /home/<username>/ghost/mysql:/var/lib/mysql
    networks:
      - ghost-network

networks:
  ghost-network:
  npm-nw: 
    external: true

Guarde el archivo pulsando Ctrl + X e introduciendo Y cuando se le solicite.

Como puedes ver, hemos conectado el contenedor Ghost con el gestor de proxies Nginx utilizando la red externa npm-nw. De esta manera, no estamos exponiendo los puertos de Ghost al sistema. También hemos utilizado una red interna ghost-network para conectar nuestra app Ghost y el contenedor de base de datos correspondiente.

Inicie el contenedor.

$ docker-compose up -d

Configurar Ghost en el gestor de proxies de Nginx

Ahora, necesitamos configurar el proxy inverso para nuestra instalación de Ghost. Abra el gestor de proxy Nginx en su navegador, vaya a Dashboard >> Hosts >> Proxy Hosty añada un nuevo Proxy Host.

Ghost Blog Nginx Proxy Manager Configurar

Agregue el nombre de dominio que eligió para su blog Ghost. Para el Nombre de host/IP introduzca el nombre de su contenedor. En este caso, sería ghost-app. No podemos añadir la dirección IP aquí porque no hemos expuesto el puerto de Ghost al servidor, y el proxy Nginx no podrá llegar a Ghost a través de la IP. Por lo tanto, usamos el nombre del contenedor, al que NPM puede acceder usando la red de Docker npm-nw, que hemos creado. Utiliza 2368 como puerto, el puerto por defecto utilizado por el Blog de Ghost. Comprueba las otras opciones como se muestra en la captura de pantalla anterior.

A continuación, cambie a la pestaña SSL y cree un nuevo certificado SSL siguiendo el paso 6. Como vas a subir contenido a tu blog de Ghost, sería bueno establecer un tamaño máximo de carga para tus subidas.

Afortunadamente, NPM te permite añadir configuraciones personalizadas. Cambie a la Avanzado e introduzca client_max_body_size 50m; en la casilla.

Configuración avanzada de Ghost Blog NPM

Haga clic en el botón Guardar para terminar de añadir el host proxy. Deberías poder acceder a tu blog de Ghost a través de la URL https://ghost.exampl.com

Inicio del blog de Ghost

Paso 9 – Usar Nginx Proxy Manager como servicio de redirección

Veamos cómo puedes utilizar NPM para redirigir un dominio a otro fácilmente. Para ello, visita Panel de control >> Hosts >> Hosts de redirección. Desde allí, haga clic en el Añadir host de redirección para empezar.

Host de redirección del gestor de proxy Nginx

Introduzca el nombre del dominio que desea redirigir. E introduzca el dominio de reenvío. El dominio de reenvío debería estar ya configurado. Deje el esquema como auto. Dependiendo de sus necesidades, puede elegir http o https. Seleccione la opción correcta Código HTTP y compruebe Preservar la ruta y Bloqueo de explotaciones comunes opciones. Si está utilizando un esquema auto o https, asegúrese de haber seleccionado o creado un certificado SSL utilizando NPM. Haga clic en Guardar para terminar de añadir el host de redirección.

Su dominio example.com debería empezar a redirigir a blog.example.com.

Otros usos de Nginx Proxy Manager

Hay otras dos formas en las que puedes utilizar Nginx Proxy Manager. Puedes usarlo como un host 404, lo que significa que puedes usar un dominio como página de aterrizaje para mostrar a los motores de búsqueda que las páginas del dominio no existen. El paso incluye simplemente introducir un dominio y configurar SSL para él. También puede utilizar esto como una oportunidad para rastrear los registros para el nombre de dominio y ver el tráfico de referencia.

La otra característica es usar NPM como un host de flujo. Puede utilizar esta función para reenviar puertos TCP/UDP a otro ordenador de la red. Esto es útil si estás alojando servidores de juegos. Lo único que requiere es que introduzcas el puerto de entrada, el dominio de reenvío o la dirección IP, el puerto de reenvío y selecciones el tipo de puerto.

Ventana emergente del Administrador de Proxy de Nginx Nuevo Host de Flujo

Utilice el Administrador de Proxy Nginx para alojar un sitio web estático

Nginx Proxy Manager puede alojar también sitios web estáticos o dinámicos simples. Para ello, añada un nuevo host proxy y elija 127.0.0.1 como el Dominio de reenvío y 80 como el puerto.

Nginx Proxy Manager Static Website Host

Bajo el Avanzado introduzca la configuración especificando el directorio raíz. Asegúrese de que el directorio raíz para el sitio está montado en la configuración inicial de Docker compose. Aquí estamos utilizando el directorio /data/static para alojar nuestro sitio web estático.

Configuración avanzada del sitio estático del administrador de proxy Nginx

Haga clic en Guardar para terminar, y su sitio debería ser accesible. Del mismo modo, puedes alojar cualquier tipo de sitio utilizando el gestor de proxies.

Página de demostración del sitio estático

Paso 10 – Características diversas

Utilizar la función de control de acceso de Nginx Proxy Manager

Puede utilizar la función de listas de acceso de NPM para habilitar la autenticación HTTP o bloquear rangos de IP. Abra NPM y visite la sección Dashboard >> Listas de Acceso página.

Haga clic en el Añadir lista de acceso para empezar.

Nueva lista de acceso del gestor de proxies Nginx

Puede nombrar su configuración de Lista de Acceso (ACL). El Satisfacer cualquier si está marcada, permitirá el acceso si el cliente cumple alguna de las condiciones especificadas. Si un cliente pasa la autenticación HTTP pero puede fallar el acceso basado en la IP, será permitido. Pero si el Satisface cualquier no está marcada, el cliente tendrá que cumplir todas las condiciones.

La página web Pasar la autenticación al host La función de autenticación se reenviará al servidor anfitrión.

A continuación, cambie a la Autorización ficha. Aquí puede crear un nombre de usuario y una contraseña para el método de autenticación HTTP. Para añadir más de un usuario, haga clic en el botón Añadir …]. Sólo puedes añadir hasta 5 usuarios. Y hay un error con el botón de añadir, así que usa primero el botón y luego rellena los detalles. Si rellenas los detalles y haces clic en el botón después para añadir otro usuario, se borran los datos del usuario anterior.

Configuración de la Autorización del Administrador de Proxy Nginx

Cambiar a la Acceda a ficha. Aquí puede establecer a qué direcciones IP se les debe dar o denegar el acceso.

Pestaña de Acceso a IP del Administrador de Proxy Nginx

Haga clic en Guardar para terminar.

Para utilizar esta lista de acceso, es necesario seleccionarla al añadir el host proxy. Como en el ejemplo de Ghost Blog de abajo, hemos seleccionado nuestra lista de acceso.

Soporte de la lista de acceso de proxy del gestor de proxys de Nginx

Habilitar soporte para más nombres de dominio

A medida que el número de hosts y dominios crece, su Nginx puede quedarse sin espacio de hash o puede tener problemas de memoria. Podemos añadir una configuración personalizada que se aplicará a todos los hosts para resolver este problema.

Para hacer esto, cree el directorio personalizado dentro de ~/nginx-proxy/data/nginx.

$ sudo mkdir ~/nginx-proxy/data/nginx/custom

Cree y abra el archivo http.conf dentro de este directorio.

$ sudo nano ~/nginx-proxy/data/nginx/custom/http.conf

Pegue las siguientes líneas en él.

proxy_headers_hash_max_size 1024;
proxy_headers_hash_bucket_size 128;

Guarde el archivo pulsando Ctrl + X e introduciendo Y cuando se le solicite.

Nginx debería aceptar automáticamente estos valores. Si no sucede, puedes reiniciar el contenedor NPM usando el siguiente comando.

$ docker restart npm-app

Redirigir la página de destino por defecto

En el paso 6, usted ve la página por defecto cuando escribe la URL http://<yourserverIP>. Si quiere cambiar eso, es posible hacerlo. Para ello, visite la página Página de configuración. Haga clic en los tres puntos de la derecha y pulse el botón Editar botón.

Nginx Proxy Manager Landing Page Edit

Puede configurar la página de destino para que actúe como una página 404, una página de redirección o añadirle HTML personalizado utilizando la opción Página personalizada. Si selecciona Redirigir, tendrá que especificar la URL de destino.

Configuración del sitio por defecto del Administrador de Proxy Nginx

Este es el HTML personalizado que utilizamos para nuestro propósito.

<!doctype html>
<html>
  <head>
    <title>Nothing Here</title>
    <meta charset="utf-8"/>
    <meta name="robots" content="noindex"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
      body { 
          text-align: center; 
          padding: 20px; 
          font: 20px Helvetica, sans-serif; 
          color: #333; 
        }
      @media (min-width: 768px){
          body{ padding-top: 150px; 
        }
      }
      h1 { 
          font-size: 50px; 
        }
      article { 
          display: block; 
          text-align: left; 
          max-width: 650px; 
          margin: 0 auto; 
        }
    </style>
  </head>
  <body>
    <article>
        <h1>Oops!</h1>
        <div>
            <p>Sorry for the inconvenience but you are not supposed to be here. You won't get anything here. This page was set for HowtoForge Nginx Proxy Manager Guide.  Maybe, someday it will show something.</p>
        </div>
    </article>
  </body>
</html>

Haga clic en Guardar para terminar. Su página de aterrizaje debería cambiar a algo como lo siguiente.

Página de aterrizaje personalizada del Administrador de Proxy Nginx

Paso 11 – Actualizar el Gestor de Proxy Nginx

Para actualizar NPM, primero, detenga los contenedores.

$ cd ~/nginx-proxy
$ docker-compose down --remove-orphans

Saque las últimas imágenes.

$ docker-compose pull

Inicie los contenedores de nuevo.

$ docker-compose up -d

Conclusión

Con esto concluye nuestro tutorial en el que has instalado Nginx Proxy Manager y has aprendido a utilizarlo para añadir un host proxy para otro contenedor Docker, utilizarlo como servicio de redirección y controlar el acceso con él. Si tienes alguna pregunta, publícala en los comentarios a continuación.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *