15%

Ahorra 15%<\/span> en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código:

Skills
Comenzar
09.10.2024

Cómo Configurar Nginx para Escuchar en Múltiples Puertos

Nginx puede escuchar en múltiples puertos simultáneamente añadiendo múltiples directivas `listen` dentro de uno o más bloques `server` en su configuración. Cada directiva `listen` vincula Nginx a una combinación específica de IP/puerto, lo que permite que una única instancia del servidor gestione tráfico HTTP, HTTPS y de aplicaciones personalizadas en puertos distintos sin ejecutar procesos separados.

Esta capacidad es esencial para entornos multi-tenant, separación de puertos de staging/producción, arquitecturas de proxy inverso y enrutamiento de microservicios — todo desde una única instancia de VPS Hosting.

Requisitos previos

Antes de continuar, confirme lo siguiente:

  • Nginx está instalado y el servicio está activo (`systemctl status nginx`)
  • Tiene privilegios `root` o `sudo` en el servidor
  • Comprende la diferencia entre `/etc/nginx/nginx.conf` (configuración global) y `/etc/nginx/sites-available/` (bloques de configuración por sitio)
  • Las reglas del firewall (`ufw`, `iptables` o un grupo de seguridad en la nube) permiten el tráfico en los puertos que desea abrir
  • Hay certificados SSL válidos disponibles si se configuran puertos HTTPS (autofirmados o emitidos por una CA)

Arquitectura de configuración de Nginx: Lo que necesita saber primero

Nginx utiliza un modelo de configuración jerárquico: el contexto `http` contiene uno o más bloques `server`, cada uno de los cuales puede contener una o más directivas `listen`. Comprender esta jerarquía evita los errores de configuración más comunes.

Directivas clave involucradas:

  • `listen [address:]port [ssl] [http2] [default_server]` — vincula el bloque de servidor a un puerto específico y una IP opcional
  • `server_name` — coincide con el encabezado `Host` para enrutar las solicitudes al bloque correcto
  • `default_server` — designa qué bloque de servidor gestiona las solicitudes que no coinciden con ningún otro `server_name`

Ubicaciones de archivos de configuración por distribución:

DistribuciónConfiguración principalConfiguraciones de sitios
Ubuntu / Debian`/etc/nginx/nginx.conf``/etc/nginx/sites-available/`
CentOS / RHEL / AlmaLinux`/etc/nginx/nginx.conf``/etc/nginx/conf.d/`
Arch Linux`/etc/nginx/nginx.conf``/etc/nginx/sites-available/`
Docker (imagen oficial)`/etc/nginx/nginx.conf``/etc/nginx/conf.d/`

En sistemas basados en Debian, los archivos en `sites-available/` deben estar enlazados simbólicamente a `sites-enabled/` para que surtan efecto:

“`bash

sudo ln -s /etc/nginx/sites-available/example.conf /etc/nginx/sites-enabled/

“`

Paso 1: Abrir el archivo de configuración de Nginx

Para un cambio global que afecte a todos los hosts virtuales:

“`bash

sudo nano /etc/nginx/nginx.conf

“`

Para una configuración específica de un sitio (recomendada para producción):

“`bash

sudo nano /etc/nginx/sites-available/example.conf

“`

Se recomienda encarecidamente el uso de archivos específicos por sitio. Aísla los cambios, simplifica la reversión y evita que una única configuración incorrecta derribe todos los servicios alojados.

Paso 2: Configurar múltiples directivas listen en un único bloque de servidor

La configuración multi-puerto más sencilla vincula un bloque de servidor a varios puertos. Nginx aplicará una lógica de enrutamiento idéntica independientemente del puerto por el que se haya conectado el cliente.

“`nginx

server {

listen 80;

listen 8080;

server_name example.com;

root /var/www/html;

index index.html index.htm;

location / {

try_files $uri $uri/ =404;

}

access_log /var/log/nginx/example_access.log;

error_log /var/log/nginx/example_error.log warn;

}

“`

Qué hace esto:

  • `listen 80;` — acepta tráfico HTTP estándar
  • `listen 8080;` — acepta tráfico en el puerto HTTP alternativo (común en entornos de desarrollo, APIs internas o comprobaciones de estado del balanceador de carga)
  • Ambos puertos sirven contenido idéntico desde `/var/www/html`

Caso especial — vinculación a una dirección IP específica: En un servidor con múltiples interfaces de red (por ejemplo, una IP pública y una IP de LAN privada), puede restringir en qué interfaz escucha Nginx:

“`nginx

listen 192.168.1.10:8080;

listen 0.0.0.0:80;

“`

Esto es fundamental en configuraciones de servidores multi-homed para evitar la exposición pública no deseada de servicios internos.

Paso 3: Configurar HTTPS en múltiples puertos

HTTPS requiere el parámetro `ssl` en la directiva `listen` y rutas válidas de certificado/clave. El siguiente ejemplo vincula HTTPS tanto al puerto estándar 443 como a un puerto personalizado 8443:

“`nginx

server {

listen 443 ssl;

listen 8443 ssl;

server_name example.com;

ssl_certificate /etc/nginx/ssl/example.com.crt;

ssl_certificate_key /etc/nginx/ssl/example.com.key;

Modern TLS hardening

ssl_protocols TLSv1.2 TLSv1.3;

ssl_ciphers HIGH:!aNULL:!MD5;

ssl_prefer_server_ciphers on;

ssl_session_cache shared:SSL:10m;

ssl_session_timeout 10m;

root /var/www/html;

index index.html;

location / {

try_files $uri $uri/ =404;

}

}

“`

Por qué se usa comúnmente el puerto 8443:

  • Permite el tráfico HTTPS en entornos donde el puerto 443 está bloqueado por firewalls intermedios
  • Se utiliza en desarrollo/staging para ejecutar un servidor seguro sin conflictos con un servicio de producción en el puerto 443
  • Es requerido por algunos frameworks de aplicaciones (Tomcat, proxies Node.js) que exponen HTTPS en puertos no estándar

Error crítico a evitar: Omitir `ssl_protocols` y `ssl_ciphers` deja a Nginx usando valores predeterminados potencialmente débiles. Defina siempre explícitamente los parámetros TLS, especialmente en servidores que manejan datos sensibles. Si necesita un certificado de confianza en lugar de uno autofirmado, los SSL Certificates de una CA reconocida eliminan las advertencias del navegador y satisfacen los requisitos modernos de HSTS.

Paso 4: Servir contenido diferente en distintos puertos

Cuando los puertos deben servir aplicaciones distintas — por ejemplo, un sitio web público en el puerto 80 y un panel de administración interno en el puerto 8080 — use bloques `server` separados:

“`nginx

server {

listen 80;

server_name example.com;

root /var/www/public;

index index.html;

location / {

try_files $uri $uri/ =404;

}

}

server {

listen 8080;

server_name example.com;

root /var/www/admin;

index index.html;

Restrict admin panel to internal network only

location / {

allow 10.0.0.0/8;

allow 192.168.0.0/16;

deny all;

try_files $uri $uri/ =404;

}

}

“`

Casos de uso reales para la separación de contenido por puerto:

  • Puerto 80/443: Sitio web público
  • Puerto 8080: API REST interna o endpoint de microservicio
  • Puerto 8443: Panel de administración seguro restringido por lista de IPs permitidas
  • Puerto 9000: Endpoint de métricas para scraping de Prometheus (nunca expuesto públicamente)
  • Puerto 3000/5000: Proxy inverso hacia una aplicación Node.js o Python

Paso 5: Usar Nginx como proxy inverso en múltiples puertos

Un patrón habitual en producción es usar Nginx para hacer proxy de diferentes puertos hacia diferentes servidores de aplicaciones backend:

“`nginx

server {

listen 80;

server_name app.example.com;

location / {

proxy_pass http://127.0.0.1:3000;

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection 'upgrade';

proxy_set_header Host $host;

proxy_cache_bypass $http_upgrade;

}

}

server {

listen 8080;

server_name app.example.com;

location / {

proxy_pass http://127.0.0.1:4000;

proxy_http_version 1.1;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

}

“`

Este patrón es la base de los despliegues en contenedores en un Dedicated Server donde múltiples contenedores Docker se ejecutan en diferentes puertos internos y Nginx actúa como único punto de entrada externo.

Paso 6: Validar la configuración

Nunca reinicie Nginx sin antes probar la sintaxis de la configuración. Un error de sintaxis hará que el servicio no pueda recargarse, dejando fuera de servicio todos los sitios alojados.

“`bash

sudo nginx -t

“`

Salida esperada en caso de éxito:

“`

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

“`

Si aparecen errores, la salida especificará el archivo y el número de línea. Corrija todos los problemas reportados antes de continuar.

Para una recarga sin tiempo de inactividad (preferible a un reinicio completo en producción):

“`bash

sudo systemctl reload nginx

“`

Un reinicio completo solo es necesario cuando se cambia `worker_processes`, `user` u otras directivas a nivel del proceso maestro:

“`bash

sudo systemctl restart nginx

“`

Paso 7: Verificar que Nginx escucha en los puertos correctos

Después de aplicar la configuración, confirme que Nginx se ha vinculado a los puertos esperados usando `ss` (preferible al obsoleto `netstat`):

“`bash

sudo ss -tlnp | grep nginx

“`

Salida de ejemplo:

“`

LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))

LISTEN 0 511 0.0.0.0:8080 0.0.0.0:* users:(("nginx",pid=1234,fd=7))

LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=1234,fd=8))

LISTEN 0 511 0.0.0.0:8443 0.0.0.0:* users:(("nginx",pid=1234,fd=9))

“`

Si un puerto no aparece, compruebe:

  1. La sintaxis de la directiva `listen` en el archivo de configuración
  2. Si otro proceso ya está ocupando ese puerto: `sudo ss -tlnp | grep :8080`
  3. Si `nginx -t` se ejecutó sin errores
  4. Políticas de SELinux o AppArmor que puedan bloquear la vinculación a puertos no estándar

Prueba con curl desde la línea de comandos (más fiable que un navegador para depuración):

“`bash

curl -I http://example.com

curl -I http://example.com:8080

curl -Ik https://example.com

curl -Ik https://example.com:8443

“`

El indicador `-I` obtiene solo los encabezados. Una respuesta `200 OK` o `301 Moved Permanently` confirma que el puerto está activo y Nginx responde correctamente.

Paso 8: Abrir puertos en el firewall

Escuchar en un puerto en Nginx es insuficiente si el firewall del host bloquea las conexiones entrantes. Asegúrese de que los puertos están permitidos:

UFW (Ubuntu/Debian):

“`bash

sudo ufw allow 80/tcp

sudo ufw allow 443/tcp

sudo ufw allow 8080/tcp

sudo ufw allow 8443/tcp

sudo ufw reload

“`

firewalld (CentOS/RHEL/AlmaLinux):

“`bash

sudo firewall-cmd –permanent –add-port=8080/tcp

sudo firewall-cmd –permanent –add-port=8443/tcp

sudo firewall-cmd –reload

“`

iptables (directo):

“`bash

sudo iptables -A INPUT -p tcp –dport 8080 -j ACCEPT

sudo iptables -A INPUT -p tcp –dport 8443 -j ACCEPT

“`

En infraestructura en la nube (AWS EC2, DigitalOcean, Hetzner), también debe actualizar el grupo de seguridad o las reglas del firewall en la nube a nivel del proveedor — los cambios en el firewall a nivel del host por sí solos no son suficientes.

Comparación: Configuraciones de Nginx con puerto único vs. múltiples puertos

CaracterísticaPuerto únicoMúltiples puertos (mismo bloque)Múltiples puertos (bloques separados)
Complejidad de configuraciónBajaBajaMedia
Aislamiento de contenidoNingunoNingunoCompleto
Control de acceso por puertoNo aplicableNo posibleTotalmente compatible
Caso de usoSitios web simplesRéplicas de dev/stagingMicroservicios, paneles de administración
Proxy inverso por puertoUpstream únicoUpstream únicoUpstreams independientes
Terminación SSLPor bloqueCertificado compartidoCertificados independientes por bloque
Separación de registrosRegistro únicoRegistro únicoArchivos de registro por puerto

Errores comunes y cómo evitarlos

Conflicto de puertos con servicios existentes: El puerto 80 puede estar ya en uso por Apache. Ejecute `sudo ss -tlnp | grep :80` antes de configurar. Detenga los servicios en conflicto o reconfigúrelos para usar puertos diferentes.

Conflictos de `default_server`: Si múltiples bloques de servidor omiten `default_server` o múltiples bloques lo reclaman para el mismo puerto, Nginx usará el primer bloque en el orden del archivo. Sea explícito:

“`nginx

listen 80 default_server;

“`

IPv6 no cubierto: Añadir `listen 80;` solo vincula a IPv4. Para servidores de doble pila, añada:

“`nginx

listen [::]:80;

listen [::]:8080;

“`

SELinux bloqueando puertos no estándar: En RHEL/CentOS con SELinux en modo enforcing, Nginx no puede vincularse a puertos que no estén en su política sin permiso explícito:

“`bash

sudo semanage port -a -t http_port_t -p tcp 8080

sudo semanage port -a -t http_port_t -p tcp 8443

“`

Olvidar recargar tras los cambios: Las ediciones de configuración no tienen efecto hasta que Nginx se recargue. Automatice esto en pipelines CI/CD con un paso `nginx -t && systemctl reload nginx` posterior al despliegue.

Matriz de decisión práctica

Use esta lista de verificación para determinar el patrón de configuración multi-puerto adecuado para su escenario:

  • Mismo contenido, múltiples puertos — Use múltiples directivas `listen` en un único bloque `server`
  • Contenido diferente por puerto — Use bloques `server` separados con directorios `root` distintos
  • Diferentes aplicaciones backend por puerto — Use bloques `server` separados con `proxy_pass` apuntando a diferentes direcciones upstream
  • Asegurar un puerto no estándar — Añada `ssl` a la directiva `listen` y referencie las rutas de su certificado; asegúrese de que el SAN del certificado cubra el dominio
  • Restringir un puerto al tráfico interno — Añada directivas `allow`/`deny` o vincule `listen` solo a una IP privada
  • Ejecutando en un VPS con cPanel — Verifique que la configuración integrada de Apache/Nginx de cPanel no genere conflictos; use el “Include Editor” de cPanel o un directorio dedicado de configuración drop-in de Nginx
  • Gestión de múltiples opciones de panel de control — Revise los VPS Control Panels disponibles para encontrar uno que exponga la gestión de puertos de Nginx a través de una GUI

Preguntas frecuentes

¿Puede Nginx escuchar en el mismo puerto en múltiples bloques de servidor?

Sí. Múltiples bloques `server` pueden compartir el mismo puerto. Nginx diferencia entre ellos usando la directiva `server_name`, que coincide con el encabezado HTTP `Host`. Si ningún `server_name` coincide, el bloque `default_server` gestiona la solicitud.

¿Añadir más puertos de escucha afecta al rendimiento de Nginx?

La sobrecarga es insignificante. Cada directiva `listen` añade un descriptor de archivo al proceso maestro de Nginx. El límite práctico es el techo de descriptores de archivo abiertos del sistema (`ulimit -n`), no el número de puertos. Para despliegues de alto tráfico, ajuste `worker_rlimit_nofile` y `worker_connections` en `nginx.conf`.

¿Cómo redirijo todo el tráfico del puerto 8080 al puerto 80?

Use un bloque de servidor dedicado con una directiva `return`:

“`nginx

server {

listen 8080;

server_name example.com;

return 301 http://example.com$request_uri;

}

“`

¿Por qué Nginx no escucha en un puerto aunque la configuración parece correcta?

Las cuatro causas más comunes son: (1) la configuración no se recargó después de editar, (2) otro proceso ya está vinculado a ese puerto, (3) una regla del firewall está bloqueando el puerto, o (4) SELinux/AppArmor está impidiendo la vinculación. Trabaje cada causa de forma sistemática usando `ss -tlnp`, `nginx -t` y los comandos de estado del firewall.

¿Puedo usar diferentes certificados SSL para diferentes puertos HTTPS en el mismo dominio?

Sí. Cada bloque `server` tiene sus propias directivas `ssl_certificate` y `ssl_certificate_key`. Dos bloques de servidor pueden escuchar en los puertos 443 y 8443 respectivamente y referenciar archivos de certificado completamente diferentes, incluso para el mismo `server_name`. Esto es útil cuando se rotan certificados o se ejecuta un certificado heredado junto a uno nuevo durante un período de transición.

15%

Ahorra 15%<\/span> en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código:

Skills
Comenzar