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 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.
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
Haga clic en el botón Guardar y se le pedirá que establezca una nueva contraseña.
Haga clic en el botón Guardar y ya puede empezar a utilizar la aplicación.
Si abre la URL http://yourserverIP en su navegador, será llevado a una página por defecto que el gestor de proxy ha establecido.
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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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.
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.
Cambiar a la Acceda a ficha. Aquí puede establecer a qué direcciones IP se les debe dar o denegar el acceso.
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.
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.
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.
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.
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.