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



Un proxy inverso es un servidor web que puede situarse delante de otro servidor web o de un servicio web. Puede acortar el tráfico saliente, ejecutar como equilibrador de carga, redirigir el tráfico y ofrecer protección. El servidor web Nginx puede utilizarse como servidor proxy delante de servidores tradicionales, pero a veces configurarlo puede ser tedioso 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 beneficiario (GUI) con funciones como soporte SSL integrado mediante Let’s Encrypt, soporte para múltiples hosts, autenticación HTTP, listas de llegada y mandato de usuarios.

Este tutorial te enseñará a instalar el apoderado de proxy Nginx en un servidor Linux utilizando Docker. Cubriremos todas las distribuciones populares de Linux en un único tutorial.

Requisitos previos

  • Un servidor Linux que ejecute Ubuntu/Debian/CentOS/Alma Linux/Rocky Linux con un pequeño de 1 GB de RAM.
  • Un beneficiario no root con privilegios sudo.
  • Un nombre de dominio completo (FQDN) como npm.example.com que apunte al servidor.

Paso 1 – Configurar el cortafuegos

Cent OS/Rocky Linux/Alma Linux

Deberías tener instalado el cortafuegos Firewalld. Comprueba el estado del cortafuegos.

$ sudo firewall-cmd --state
running

Abre 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

Recarga el cortafuegos para activar los cambios.

$ sudo firewall-cmd --reload

Ubuntu/Debian

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

Comprueba si el cortafuegos se está ejecutando.

$ sudo ufw status

Si lo está, abre los puertos 80, 81 y 443.

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

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

$ sudo ufw allow "OpenSSH"

Habilita el cortafuegos si no se está ejecutando.

$ sudo ufw enable

Si se está ejecutando, vuelve a cargarlo para aplicar los cambios.

$ sudo ufw reload

Paso 2 – Instala Docker

Cent OS/Rocky Linux/Alma Linux

Ejecuta el futuro 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

Activa e inicia el servicio Docker.

$ sudo systemctl start docker --now

Añade tu nombre de beneficiario al género Docker.

$ sudo usermod -aG docker $USER

Sal del sistema y vuelve a entrar para aplicar el cambio.

Paso 3 – Instala Docker Compose

Descarga e instala 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/almacén/bin/docker-compose

Aplica el permiso de ejecutable al binario.

$ sudo chmod +x /usr/almacén/bin/docker-compose

Paso 4 – Crear archivo Docker Compose

Crea un directorio para el apoderado de proxy Nginx.

$ mkdir ~/nginx-proxy

Cambia al directorio.

$ cd ~/nginx-proxy

Crea directorios para los datos de beneficiario y los certificados SSL.

$ mkdir {data,letsencrypt}

Crea y abre el archivo docker-compose.yml para editarlo.

$ nano docker-compose.yml

Pega en él el futuro código.

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

Tutela el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Repasemos el archivo. La primera parte del archivo es donde importamos la imagen del apoderado de proxy Nginx y establecemos algunas variables de entorno en forma de credenciales de colchoneta de datos. Asimismo exponemos los puertos 80, 81 y 443 al servidor para su llegada. Puedes exponer más puertos, como el 21, para el llegada FTP. Puedes desactivar el soporte IPV6 descomentando la cuerda DISABLE_IPV6: 'true'. Hemos mapeado varios directorios de nuestro host al Docker para el almacenamiento de datos y SQL.

Aquí estamos utilizando dos redes. Una es la red interna npm-internal para conectar el apoderado proxy y la colchoneta de datos. Ésta es opcional, ya que se crea automáticamente. Pero aquí, lo estamos haciendo manualmente dándole un nombre de nuestra opción.

Hemos añadido una red externa al contenedor del apoderado de proxy citación npm-nw. Esta red es esencial porque puedes utilizarla para conectar el apoderado de proxy a cualquier otro contenedor Docker que instales. Utilizar una red te permitirá conectar directamente cualquier contenedor sin aprieto de exponer sus puertos al servidor.

Paso 5 – Ejecuta el Apoderado de Proxy Nginx

Antiguamente de divulgar el contenedor Docker, necesitamos crear la red externa npm-nw. Las redes internas se crean automáticamente. Ejecuta el futuro comando para crear la red externa.

$ docker network create npm-nw

Venablo el contenedor Docker utilizando el futuro comando.

$ docker-compose up -d

Comprueba 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 – Accede al Apoderado de Proxy Nginx

Ahora puedes lograr a tu apoderado de proxy Nginx a través de la URL http://yourserverIP:81. Deberías obtener la futuro pantalla de llegada.

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

Introduce las siguientes credenciales predeterminadas para iniciar sesión.

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

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

Nginx Proxy Manager Editar Usuario Popup

Haz clic en el clavija Asegurar, y se te pedirá que establezcas una nueva contraseña.

Ventana emergente "Establecer contraseña" del Administrador de proxy de Nginx

Vuelve a pulsar el clavija Asegurar y ya podrás iniciar a utilizar la aplicación.

Panel del Administrador de Proxy Nginx

Si abres la URL http://yourserverIP en tu navegador, accederás a una página predeterminada que el apoderado de proxy ha configurado.

Sitio predeterminado del gestor de proxy Nginx

Paso 7 – Configurar el Nombre de Dominio y SSL para el Apoderado de Proxy Nginx

Vamos a configurar un nombre de dominio para lograr al Apoderado de Proxy Nginx. Este paso es opcional pero es útil si quieres poner la aplicación detrás de SSL.

Haz clic en Anfitriones >> Anfitriones Proxy en el menú del panel de control para aclarar la página Anfitriones Proxy. Desde ahí, haz clic en el clavija Añadir Host Proxy para continuar.

Pantalla Nuevo Host Proxy del Gestor de Proxy Nginx

Añade el nombre FQDN (npm.example.com) y haz clic sobre él. Introduce la dirección IP de tu servidor y 81 como puerto de reenvío.

Cambia a la pestaña SSL.

Nginx Proxy Manager Configurar SSL

Selecciona Solicitar un nuevo certificado SSL en el menú desplegable. Selecciona las opciones Forzar SSL y Soporte HTTP/2. Si quieres activar HSTS, igualmente puedes hacerlo. Si tienes tu dominio configurado a través de Cloudflare, no habilites la opción Forzar SSL, de lo contrario, te quedarás atrapado en un onda de redireccionamiento.

Introduce tu dirección de correo electrónico, acepta las Condiciones del Servicio (CDS) de Let’s Encrypt y haz clic en el clavija Asegurar para terminar.

Lista de hosts proxy del gestor de proxy Nginx

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

Puedes hacerlo de forma similar para la página de destino predeterminada 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 – Utilizar el Apoderado de Proxy Nginx con otra aplicación web Docker

Ahora que hemos instalado el apoderado de proxy, es hora de darle algún uso. Lo primero que haremos será utilizarlo para penetrar otra aplicación web Docker. Para ello, instalaremos el blog Ghost. Si quieres conocer más, consulta nuestro tutorial sobre la instalación de Ghost utilizando Docker en un servidor Ubuntu.

Crea otro directorio para tu blog de Ghost.

$ mkdir ~/ghost

Cambia al directorio de Ghost.

$ cd ~/ghost

Crea dos directorios para el contenido y la colchoneta de datos.

$ mkdir {content,mysql}

Aunque utilices la misma imagen MySQL, debes apoyar los datos y sus contenedores separados de los del apoderado Proxy. Esto te ayudará a aislar cualquier problema que puedas encontrarte y te permitirá mover las cosas en caso de que lo necesites.

Crea y abre el archivo Docker compose para editarlo.

$ nano docker-compose.yml

Pega el futuro código. Sustituye example.com por el nombre de dominio existente de tu blog Ghost. Introduce los datos SMTP si quieres acoger 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

Tutela el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Como puedes ver, hemos conectado el contenedor Ghost con el apoderado proxy Nginx utilizando la red externa npm-nw. De esta forma, no estamos exponiendo los puertos del Ghost al sistema. Asimismo hemos utilizado una red interna ghost-network para conectar nuestra aplicación Ghost y el contenedor de colchoneta de datos correspondiente.

Inicia el contenedor.

$ docker-compose up -d

Configurar Ghost en el Apoderado de Proxy Nginx

Ahora tenemos que configurar el proxy inverso para nuestra instalación de Ghost. Abre el Apoderado de Proxy Nginx en tu navegador, ve a Panel >> Hosts >> Proxy Host, y añade un nuevo Proxy Host.

Ghost Blog Nginx Proxy Manager Configurar

Añade el nombre de dominio que elegiste para tu blog de Ghost. Para el valía Hostname/IP, introduce el nombre de tu contenedor. En este caso, sería ghost-app. No podemos añadir aquí la dirección IP porque no hemos expuesto el puerto de Ghost al servidor, y el proxy Nginx no podrá asistir a Ghost a través de la IP. Por lo tanto, utilizamos el nombre del contenedor, al que NPM puede lograr utilizando 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 demás opciones como se muestra en la captura de pantalla susodicho.

A continuación, cambia a la pestaña SSL y crea 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 mayor de carga para tus subidas.

Felizmente, NPM te permite añadir configuraciones personalizadas. Cambia a la pestaña Innovador e introduce client_max_body_size 50m; en la casilla.

Configuración avanzada de Ghost Blog NPM

Haz clic en el clavija Asegurar para terminar de añadir el host proxy. Deberías poder lograr a tu blog de Ghost a través de la URL https://ghost.exampl.com

Blog Fantasma Inicio

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

Veamos cómo puedes utilizar NPM para redirigir un dominio a otro fácilmente. Para ello, reconocimiento Panel de Control >> Anfitriones >> Anfitriones de Redirección. Desde allí, haz clic en el clavija Añadir Host de Redireccionamiento para iniciar.

Host de redirección del gestor de proxy Nginx

Introduce el nombre del dominio que quieres redireccionar. E introduce el dominio de reenvío. El dominio de reenvío ya debería estar configurado. Deja el esquema como coche. Dependiendo de tus evacuación, puedes designar http o https. Selecciona el Código HTTP correcto y marca las opciones Conservar ruta y Cerrar exploits comunes. Si utilizas un esquema coche o https, asegúrate de ocurrir seleccionado o creado un certificado SSL utilizando NPM. Haz clic en Asegurar para terminar de añadir tu host de redirección.

Tu dominio example.com debería iniciar a redirigirse a blog.example.com.

Otros usos de Nginx Proxy Manager

Hay otras dos formas en las que puedes utilizar el Apoderado de Proxy Nginx. Puedes utilizarlo como host 404, lo que significa que puedes utilizar un dominio como página de destino 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. Asimismo puedes exprimir para rastrear los registros del nombre de dominio y ver el tráfico de relato.

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

Nginx Proxy Manager Nuevo Stream Host Popup

Utilizar el Apoderado de Proxy Nginx para penetrar un sitio web pasmado

El Apoderado de Proxy Nginx igualmente puede penetrar sitios web estáticos o dinámicos sencillos. Para ello, añade un nuevo host proxy y elige 127.0.0.1 como dominio de reenvío y 80 como puerto.

Gestor de proxy Nginx Anfitrión de sitio web estático

En la pestaña Innovador, introduce la configuración especificando el directorio raíz. Asegúrate de que el directorio raíz del sitio está montado en la configuración original de Docker compose. Aquí estamos utilizando el directorio /data/static para penetrar nuestro sitio web pasmado.

Configuración avanzada del gestor de proxy Nginx Sitio estático

Haz clic en Asegurar para terminar, y tu sitio debería ser accesible. De forma similar, puedes penetrar cualquier tipo de sitio utilizando el apoderado de proxy.

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

Paso 10 – Funciones Misceláneas

Utiliza la función de control de llegada del Apoderado de Proxy Nginx

Puedes utilizar la función Listas de Entrada de NPM para habilitar la autenticación HTTP o cerrar rangos de IP. Abre NPM y reconocimiento la página Panel >> Listas de Entrada.

Haz clic en el clavija Añadir Cinta de Entrada para iniciar.

Nginx Proxy Manager Nueva Lista de Acceso

Puedes asignar un nombre a la configuración de tu Cinta de Entrada (ACL). La pestaña Satisfacer Cualquiera, si está marcada, permitirá el llegada si el cliente cumple cualquiera de las condiciones especificadas. Si un cliente pasa la autenticación HTTP pero puede dirimir el llegada basado en IP, se le permitirá. Pero si la opción Satisfacer Cualquiera no está marcada, el cliente tendrá que cumplir todas las condiciones.

La opción Acontecer autenticación al anfitri ón reenviará la autenticación al servidor huésped.

A continuación, pasa a la pestaña Autorización. Aquí puedes crear un nombre de beneficiario y una contraseña para el método de autenticación HTTP. Para añadir más de un beneficiario, haz clic en el clavija Añadir. Sólo puedes añadir hasta 5 usuarios. Hay un error con el clavija Añadir, así que utiliza primero el clavija y luego rellena los detalles. Si rellenas los detalles y pulsas el clavija más tarde para añadir otro beneficiario, se borrarán los datos del beneficiario susodicho.

Configuración de la autorización del gestor de proxy de Nginx

Cambia a la pestaña Entrada. Aquí puedes establecer a qué direcciones IP se les debe dar o rechazar el llegada.

Pestaña Acceso IP del Gestor de Proxy Nginx

Haz clic en Asegurar para terminar.

Para utilizar esta inventario de Entrada, debes seleccionarla cuando añadas tu host proxy. Como en el ejemplo para Ghost Blog de debajo, hemos seleccionado nuestra Cinta de llegada.

Nginx Proxy Manager Soporte de Lista de Acceso Proxy

Habilitar el soporte para más nombres de dominio

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

Para ello, crea el directorio custom interiormente de ~/nginx-proxy/data/nginx.

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

Crea y abre el archivo http.conf interiormente de este directorio.

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

Pega en él las siguientes líneas.

proxy_headers_hash_max_size 1024;
proxy_headers_hash_bucket_size 128;

Tutela el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Nginx debería aceptar automáticamente estos títulos. Si no lo hace, puedes reiniciar el contenedor NPM utilizando el futuro comando.

$ docker restart npm-app

Redirigir la página de destino predeterminada

En el paso 6, verás la página por defecto cuando escribas la URL http://<yourserverIP>. Si quieres cambiarla, es posible hacerlo. Para ello, reconocimiento la Página de Configuración. Haz clic en los tres puntos de la derecha y pulsa el clavija Editar.

Nginx Proxy Manager Página de inicio Editar

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

Configuración predeterminada del sitio del Gestor de Proxy Nginx

Este es el HTML personalizado que hemos utilizado 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 coche; 
        }
    </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>

Haz clic en Asegurar para terminar. Tu página de destino debería cambiar a poco parecido a lo futuro.

Página de destino personalizada del Gestor de Proxy Nginx

Paso 11 – Modernizar Nginx Proxy Manager

Para refrescar NPM, primero, detén los contenedores.

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

Extrae las últimas imágenes.

$ docker-compose pull

Arranca de nuevo los contenedores.

$ 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 llegada mediante él. Si tienes alguna pregunta, publícala en los comentarios a continuación.