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.
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.
Haz clic en el clavija Asegurar, y se te pedirá que establezcas una nueva contraseña.
Vuelve a pulsar el clavija Asegurar y ya podrás iniciar a utilizar la aplicación.
Si abres la URL http://yourserverIP
en tu navegador, accederás a una página predeterminada que el apoderado de proxy ha configurado.
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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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.
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.
Cambia a la pestaña Entrada. Aquí puedes establecer a qué direcciones IP se les debe dar o rechazar el llegada.
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.
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.
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.
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.
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.