Un proxy inverso es un servidor web que puede ubicarse frente a otro servidor web o 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 se puede usar como un servidor proxy frente a los 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 un servidor proxy al proporcionar una interfaz gráfica de usuario (GUI) con características como compatibilidad con SSL integrada mediante Let's Encrypt, compatibilidad con múltiples hosts, autenticación HTTP, listas de acceso y gestión.
Este tutorial le enseñará cómo instalar el administrador de proxy Nginx en un servidor Linux usando Docker. Cubriremos todas las distribuciones populares de Linux en un solo tutorial.
Requisitos
- Un servidor Linux que ejecute 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
apuntando al servidor.
Paso 1:configurar el cortafuegos
CentOS/Rocky Linux/Alma Linux
Debe 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
Vuelva a cargar el cortafuegos para habilitar los cambios.
$ sudo firewall-cmd --reload
Ubuntu/Debian
Los sistemas Ubuntu y Debian usan ufw (cortafuegos sin complicaciones) de forma predeterminada.
Compruebe si el cortafuegos se está ejecutando.
$ sudo ufw status
Si se está ejecutando, 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 firewall si no se está ejecutando.
$ sudo ufw enable
Si se está ejecutando, vuelva a cargarlo 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
Agregue su nombre de usuario al grupo de Docker.
$ sudo usermod -aG docker $USER
Cierre sesión en el sistema y vuelva a iniciar sesión para aplicar el cambio.
Paso 3:instalar Docker Compose
Descargue e instale el binario de composición de Docker.
$ 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
Aplicar permiso ejecutable al binario.
$ sudo chmod +x /usr/local/bin/docker-compose
Paso 4:Crear archivo de composición de Docker
Cree un directorio para el administrador de proxy Nginx.
$ mkdir ~/nginx-proxy
Cambia al directorio.
$ cd ~/nginx-proxy
Cree directorios para datos de usuario y certificados SSL.
$ mkdir {data,letsencrypt}
Crea y abre docker-compose.yml
archivo para editar.
$ 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 presionando Ctrl + X e ingresando Y cuando se le solicite.
Repasemos el archivo. La primera parte del archivo es donde importamos la imagen del administrador de proxy Nginx y configuramos 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. Puede exponer más puertos, como 21, para acceso FTP. Puede deshabilitar la compatibilidad con IPV6 descomentando la línea DISABLE_IPV6: 'true'
. Hemos asignado varios directorios de nuestro host a Docker para almacenamiento de datos y SQL.
Estamos usando dos redes aquí. Una es la red interna npm-internal
para conectar el administrador de proxy y la base de datos. Este es opcional ya que se crea automáticamente. Pero aquí, lo estamos haciendo manualmente dándole un nombre de nuestra elección.
Hemos agregado una red externa al contenedor del administrador de proxy llamada npm-nw
. Esta red es esencial porque puede usarla para conectar el administrador de proxy a cualquier otro contenedor acoplable que instale. El uso de una red le permitirá conectar cualquier contenedor directamente sin necesidad de exponer sus puertos al servidor.
Paso 5:ejecutar Nginx Proxy Manager
Antes de lanzar el contenedor Docker, debemos 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 Docker Container con el siguiente comando.
$ docker-compose up -d
Consulta 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 administrador de proxy de Nginx
Ahora puede acceder a su administrador de proxy Nginx a través de la URL http://yourserverIP:81
. Debería obtener la siguiente pantalla de inicio de sesión.
Introduzca las siguientes credenciales predeterminadas para iniciar sesión.
Dirección de correo electrónico: [email protected]
A continuación, se le pedirá inmediatamente que establezca un nombre y una dirección de correo electrónico.
Haz clic en Guardar y se le pedirá que establezca una nueva contraseña.
Haz clic en Guardar botón de nuevo, y ahora puede comenzar a usar la aplicación.
Si abre la URL http://yourserverIP
en su navegador, se le llevará a una página predeterminada que ha establecido el administrador de proxy.
Paso 7:configurar el nombre de dominio y SSL para Nginx Proxy Manager
Establezcamos un nombre de dominio para acceder a Nginx Proxy Manager. Este paso es opcional pero es útil si desea poner la aplicación detrás de SSL.
Haga clic en Hosts>> Hosts proxy desde el menú del tablero para abrir la página Proxy Hosts. Desde allí, haga clic en Agregar host proxy botón para continuar.
Agregue el nombre FQDN (npm.example.com
) y haga clic en él. Ingrese la dirección IP de su servidor y 81 como el Puerto de reenvío .
Cambie a la pestaña SSL.
Seleccione Solicitar un nuevo certificado SSL del menú desplegable. Selecciona las opciones Forzar SSL y compatibilidad con HTTP/2 . Si desea habilitar HSTS, también puede habilitarlo. Si tienes tu dominio configurado a través de Cloudflare, no habilites la opción Forzar SSL de lo contrario, quedará atrapado en un bucle de redirección.
Ingrese su dirección de correo electrónico, acepte los Términos de servicio (TOS) de Let's Encrypt y haga clic en Guardar botón para terminar.
Su dominio debe estar vivo y funcionando. Intenta abrir https://npm.example.com
en su navegador, y debería obtener la pantalla de inicio de sesión de Nginx Proxy Manager.
De manera similar, puede hacerlo para la página de destino predeterminada y asignarla a un nombre de dominio como https://example.com
. Simplemente cambie el puerto de 81 a 81 mientras configura el servidor proxy.
Paso 8:use Nginx Proxy Manager con otra aplicación web de Docker
Ahora que hemos instalado el administrador de proxy, es hora de darle algún uso. Lo primero que haremos será usarlo para alojar otra aplicación web de Docker. Para ello, estaremos instalando el blog Ghost. Si desea obtener más información, consulte nuestro tutorial sobre cómo instalar Ghost usando Docker en un servidor Ubuntu.
Cree otro directorio para su blog Ghost.
$ mkdir ~/ghost
Cambia al directorio Ghost.
$ cd ~/ghost
Cree dos directorios para el contenido y la base de datos.
$ mkdir {content,mysql}
Incluso si está utilizando la misma imagen de MySQL, debe mantener los datos y sus contenedores separados de los del administrador de proxy. Esto ayudará a aislar cualquier problema con el que te puedas encontrar y te permitirá mover cosas en caso de que lo necesites.
Cree y abra el archivo de redacción de Docker para editarlo.
$ nano docker-compose.yml
Pegue el siguiente código. Reemplace example.com
con su nombre de dominio real para su blog Ghost. Ingrese los detalles de SMTP si desea recibir correos electrónicos. Puede eliminarlos si no los necesita.
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 presionando Ctrl + X e ingresando Y cuando se le solicite.
Como puede ver, hemos conectado el contenedor Ghost con el administrador de proxy Nginx usando 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 aplicación Ghost y el contenedor de base de datos correspondiente.
Inicie el contenedor.
$ docker-compose up -d
Configurar Ghost en Nginx Proxy Manager
Ahora, necesitamos configurar el proxy inverso para nuestra instalación de Ghost. Abra el administrador de Nginx Proxy en su navegador, vaya a Panel de control>> Hosts>> Host de proxy y agregue un nuevo servidor proxy.
Agregue el nombre de dominio que eligió para su blog Ghost. Para el nombre de host/IP valor, ingrese el nombre de su contenedor. En este caso, sería ghost-app
. No podemos agregar 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 creamos. Usa 2368
como puerto, el puerto predeterminado utilizado por Ghost Blog. Verifique 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. Dado que cargará contenido en su blog de Ghost, sería bueno establecer un tamaño de carga máximo para sus cargas.
Afortunadamente, NPM le permite agregar configuraciones personalizadas. Cambiar a Avanzado pestaña e ingrese client_max_body_size 50m;
en la caja.
Haz clic en Guardar para terminar de agregar el servidor proxy. Debería poder acceder a su blog Ghost a través de la URL https://ghost.exampl.com
Paso 9:use Nginx Proxy Manager como servicio de redirección
Veamos cómo puede usar NPM para redirigir un dominio a otro fácilmente. Para hacerlo, visite Panel de control>> Hosts>> Hosts de redirección . Desde allí, haga clic en Agregar host de redirección botón para empezar.
Ingrese el nombre de dominio que desea reenviar. E ingrese el dominio de reenvío. El dominio de reenvío ya debería estar configurado. Deje el esquema como automático. Según sus requisitos, puede elegir http o https . Seleccione el código HTTP correcto y marque Preservar ruta y Bloquear exploits comunes opciones Si está usando un esquema automático o https, asegúrese de haber seleccionado o creado un certificado SSL usando NPM. Haz clic en Guardar para terminar de agregar su host de redirección.
Su dominio example.com
debería comenzar a redirigir a blog.example.com
.
Otros usos de Nginx Proxy Manager
Hay otras dos formas en las que puede usar Nginx Proxy Manager. Puede usarlo como host 404, lo que significa que puede usar 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 ingresar un dominio y configurar SSL para él. También puede usar esto como una oportunidad para rastrear los registros del nombre de dominio y ver el tráfico de referencia.
La otra característica es usar NPM como host de transmisión. Puede usar esta función para reenviar puertos TCP/UDP a otra computadora en la red. Esto es útil si está alojando servidores de juegos. Lo único que requiere es que ingrese el puerto entrante, el dominio de reenvío o la dirección IP, el puerto de reenvío y seleccione el tipo de puerto.
Use Nginx Proxy Manager para alojar un sitio web estático
Nginx Proxy Manager también puede alojar sitios web estáticos o dinámicos simples. Para hacerlo, agregue un nuevo host proxy y elija 127.0.0.1
como el dominio de reenvío y 80 como el puerto .
En Avanzado pestaña, ingrese a la configuración especificando el directorio raíz. Asegúrese de que el directorio raíz del sitio esté montado en la configuración de composición inicial de Docker. Aquí estamos usando el /data/static
directorio para alojar nuestro sitio web estático.
Haz clic en Guardar para terminar, y su sitio debe ser accesible. De manera similar, puede alojar cualquier tipo de sitio utilizando el administrador de proxy.
Paso 10 - Funciones varias
Usar la función de control de acceso de Nginx Proxy Manager
Puede usar la función Listas de acceso de NPM para habilitar la autenticación HTTP o bloquear rangos de IP. Abra NPM y visite el Panel de control>> Listas de acceso página.
Haga clic en Agregar lista de acceso botón para empezar.
Puede nombrar su configuración de lista de acceso (ACL). Satisfacer cualquiera La pestaña, 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 IP, se le permitirá. Pero si el Satisface Cualquiera está desmarcada, el cliente deberá cumplir con todas las condiciones.
Pasar autenticación al host La función reenviará la función de autenticación al servidor host.
A continuación, cambie a la Autorización pestaña. Aquí puede crear un nombre de usuario y una contraseña para el método de autenticación HTTP. Para agregar más de un usuario, haga clic en Agregar botón. Solo puede agregar hasta 5 usuarios. Y hay un error con el botón Agregar, así que use el botón primero y luego complete los detalles. Si completa los detalles y hace clic en el botón más tarde para agregar otro usuario, se borran los datos del usuario anterior.
Cambiar a Acceso pestaña. Aquí puede establecer qué direcciones IP se otorgarán o denegarán el acceso.
Haz clic en Guardar para terminar.
Para usar esta lista de acceso, debe seleccionarla al agregar su servidor proxy. Como en el ejemplo de Ghost Blog a continuación, hemos seleccionado nuestra lista de acceso.
Habilitar soporte para más nombres de dominio
A medida que aumenta la cantidad de hosts y dominios, es posible que su Nginx se quede sin espacio hash o tenga problemas de memoria. Podemos agregar una configuración personalizada que se aplicará a todos los hosts para resolver este problema.
Para ello, crea el directorio personalizado dentro de ~/nginx-proxy/data/nginx
.
$ sudo mkdir ~/nginx-proxy/data/nginx/custom
Crea y abre 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 presionando Ctrl + X e ingresando Y cuando se le solicite.
Nginx debería aceptar automáticamente estos valores. Si no sucede, puede reiniciar el contenedor NPM con el siguiente comando.
$ docker restart npm-app
Redireccionar página de destino predeterminada
En el paso 6, verá la página predeterminada cuando escriba la URL http://<yourserverIP>
. Si quieres cambiar eso, es posible hacerlo. Para ello, visita la página de configuración. . Haga clic en los tres puntos en el lado derecho y haga clic en Editar botón.
Puede configurar la página de destino para que actúe como una página 404, redireccionar la página o agregarle HTML personalizado mediante la opción Página personalizada. . Si selecciona Redireccionar , deberá especificar la URL de destino.
Este es el HTML personalizado que usamos 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>
Haz clic en Guardar para terminar. Su página de destino debe cambiarse a algo como lo siguiente.
Paso 11:actualizar el administrador de proxy de Nginx
Para actualizar NPM, primero detenga los contenedores.
$ cd ~/nginx-proxy $ docker-compose down --remove-orphans
Obtenga las últimas imágenes.
$ docker-compose pull
Inicie los contenedores de nuevo.
$ docker-compose up -d
Conclusión
Esto concluye nuestro tutorial en el que instaló Nginx Proxy Manager y aprendió a usarlo para agregar un host proxy para otro contenedor docker, usarlo como un servicio de redirección y controlar el acceso al usarlo. Si tiene alguna pregunta, publíquela en los comentarios a continuación.