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
31.10.2024

Cómo Configurar Virtual Hosts en Nginx en Ubuntu

Configurar hosts virtuales en Nginx es una de las técnicas más poderosas para alojar múltiples sitios web en un único servidor, cada uno con su propio nombre de dominio, directorio raíz y configuración independiente. Nginx maneja esto a través de bloques de servidor — unidades de configuración flexibles y ligeras que definen cómo el servidor web responde a las solicitudes de cada dominio.

Ya sea que estés administrando un portafolio personal, ejecutando sitios web de clientes o escalando una aplicación multiinquilino, esta guía proporciona un recorrido completo y listo para producción para configurar hosts virtuales de Nginx en Ubuntu. Cubriremos estructura de directorios, configuración de bloques de servidor, habilitación de sitios, configuración de SSL/HTTPS y solución de problemas — todo lo que necesitas para pasar de cero a un servidor Nginx multisitio completamente funcional.

> ¿Buscas un servidor Ubuntu confiable para seguir adelante? Los planes de VPS Hosting de AlexHost te dan acceso root completo, almacenamiento SSD e implementación instantánea — perfecto para este caso de uso exacto.

Tabla de Contenidos

  1. Requisitos Previos
  2. Configurar Directorios para Cada Sitio Web
  3. Crear Contenido HTML de Ejemplo
  4. Crear Archivos de Configuración de Host Virtual
  5. Habilitar los Hosts Virtuales
  6. Probar la Configuración de Nginx
  7. Reiniciar Nginx para Aplicar Cambios
  8. Acceder a Tus Sitios Web
  9. Habilitar HTTPS con Let’s Encrypt (Recomendado)
  10. Solución de Problemas Comunes
  11. Conclusión

Requisitos Previos

Antes de comenzar, asegúrate de que se cumplan las siguientes condiciones:

Nginx Instalado en Tu Servidor

Si Nginx aún no está instalado, ejecuta los siguientes comandos en tu servidor Ubuntu:

sudo apt update
sudo apt install nginx

Verifica la instalación y comprueba que el servicio se está ejecutando:

sudo systemctl status nginx

Deberías ver active (running) en la salida. Si no, inicia el servicio manualmente:

sudo systemctl start nginx
sudo systemctl enable nginx

Nombres de Dominio Apuntando a Tu Servidor

Cada host virtual requiere un nombre de dominio que se resuelva en la dirección IP pública de tu servidor. Necesitarás crear registros A en tu configuración de DNS apuntando a la IP del servidor.

> ¿Necesitas un dominio? Registra el tuyo a través de Registro de Dominios de AlexHost y administra registros DNS directamente desde tu panel de control.

Para propósitos de prueba local, puedes omitir DNS completamente editando tu archivo /etc/hosts (cubierto en el Paso 7).

Permisos Requeridos

Necesitarás privilegios sudo en tu servidor Ubuntu para crear directorios, editar archivos de configuración y administrar el servicio de Nginx.

Paso 1: Configurar Directorios para Cada Sitio Web

Cada sitio web alojado en tu servidor debe tener su propio directorio aislado para almacenar archivos web. Esta separación mantiene tus proyectos organizados y previene conflictos de configuración.

En esta guía, configuraremos dos dominios de ejemplo: example1.com y example2.com. Reemplaza estos con tus nombres de dominio reales en toda la guía.

Crear los Directorios Raíz Web

sudo mkdir -p /var/www/example1.com/html
sudo mkdir -p /var/www/example2.com/html

La bandera -p crea todos los directorios intermedios según sea necesario.

Asignar Propiedad Correcta

Otorga propiedad de estos directorios a www-data, el usuario del sistema que ejecuta Nginx:

sudo chown -R www-data:www-data /var/www/example1.com/html
sudo chown -R www-data:www-data /var/www/example2.com/html

Esto asegura que Nginx tenga los permisos de lectura necesarios para servir archivos desde estos directorios.

Establecer Permisos de Directorio

sudo chmod -R 755 /var/www

El permiso 755 significa que el propietario tiene acceso completo de lectura/escritura/ejecución, mientras que grupos y otros usuarios tienen acceso de lectura y ejecución — apropiado para contenido web servido públicamente.

Paso 2: Crear Contenido HTML de Ejemplo

Para verificar que cada host virtual funciona correctamente, crea un archivo index.html simple para cada sitio.

Para example1.com

echo "<h1>Welcome to Example1.com!</h1>" | sudo tee /var/www/example1.com/html/index.html

Para example2.com

echo "<h1>Welcome to Example2.com!</h1>" | sudo tee /var/www/example2.com/html/index.html

Estas páginas de marcador de posición confirmarán que Nginx está enrutando solicitudes al directorio de documentos correcto para cada dominio.

Paso 3: Crear Archivos de Configuración de Host Virtual

Nginx almacena archivos de configuración de sitios en /etc/nginx/sites-available/. Cada archivo define un bloque de servidor — el equivalente de Nginx de un host virtual de Apache. Los sitios habilitados se enlazan simbólicamente en /etc/nginx/sites-enabled/.

Configuración para example1.com

Crea un nuevo archivo de configuración:

sudo nano /etc/nginx/sites-available/example1.com

Añade el siguiente bloque de servidor:

server {
    listen 80;
    listen [::]:80;

    server_name example1.com www.example1.com;

    root /var/www/example1.com/html;
    index index.html index.htm;

    access_log /var/log/nginx/example1.com.access.log;
    error_log  /var/log/nginx/example1.com.error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

Guarda y cierra el archivo (Ctrl+X, luego Y, luego Enter).

Configuración para example2.com

Crea un segundo archivo de configuración:

sudo nano /etc/nginx/sites-available/example2.com

Añade el siguiente bloque de servidor:

server {
    listen 80;
    listen [::]:80;

    server_name example2.com www.example2.com;

    root /var/www/example2.com/html;
    index index.html index.htm;

    access_log /var/log/nginx/example2.com.access.log;
    error_log  /var/log/nginx/example2.com.error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

Directivas Clave Explicadas

DirectivaPropósito
listen 80Escucha conexiones HTTP entrantes en el puerto 80
listen [::]:80Habilita soporte IPv6 en el puerto 80
server_nameDefine qué nombres de dominio maneja este bloque
rootEstablece la raíz del documento — donde se almacenan los archivos del sitio web
indexEspecifica el archivo predeterminado a servir cuando se solicita un directorio
try_filesIntenta servir el archivo solicitado; devuelve 404 si no se encuentra
access_log / error_logArchivos de registro separados por sitio para facilitar la depuración

Paso 4: Habilitar los Hosts Virtuales

Nginx activa sitios creando enlaces simbólicos desde sites-available a sites-enabled. Este diseño te permite preparar configuraciones sin activarlas inmediatamente.

sudo ln -s /etc/nginx/sites-available/example1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example2.com /etc/nginx/sites-enabled/

Eliminar el Sitio Predeterminado (Opcional pero Recomendado)

Si deseas evitar que la página de marcador de posición predeterminada de Nginx interfiera, desactívala:

sudo rm /etc/nginx/sites-enabled/default

Siempre puedes reactivarla más tarde recreando el enlace simbólico.

Paso 5: Probar la Configuración de Nginx

Antes de reiniciar Nginx, siempre valida tus archivos de configuración para errores de sintaxis. Un archivo mal configurado puede derribar todos los sitios en el servidor.

sudo nginx -t

Una prueba exitosa devuelve:

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

Si ves errores, Nginx indicará el archivo y número de línea donde ocurrió el problema. Revisa el archivo de configuración relevante y corrige cualquier error tipográfico o punto y coma faltante antes de continuar.

Paso 6: Reiniciar Nginx para Aplicar Cambios

Una vez que la prueba de configuración pase, recarga o reinicia Nginx para aplicar tus cambios:

sudo systemctl restart nginx

Alternativamente, usa reload para un reinicio elegante que no interrumpa conexiones activas:

sudo systemctl reload nginx

Paso 7: Acceder a Tus Sitios Web

Si DNS Ya Está Configurado

Si tus nombres de dominio ya están apuntando a la dirección IP de tu servidor a través de registros A de DNS, simplemente abre un navegador y navega a:

  • http://example1.com
  • http://example2.com

Deberías ver los respectivos mensajes de “Bienvenida” que creaste en el Paso 2.

Para Pruebas Locales (Sin DNS)

Si estás probando localmente o DNS aún no se ha propagado, puedes simular la resolución de dominios editando el archivo /etc/hosts de tu máquina local (en Linux/macOS) o C:WindowsSystem32driversetchosts (en Windows).

Abre el archivo con privilegios elevados:

sudo nano /etc/hosts

Añade las siguientes líneas, reemplazando YOUR_SERVER_IP con la IP real de tu servidor:

YOUR_SERVER_IP example1.com www.example1.com
YOUR_SERVER_IP example2.com www.example2.com

Guarda el archivo y prueba en tu navegador. Recuerda eliminar estas entradas una vez que tus registros DNS reales estén activos.

Paso 8: Habilitar HTTPS con Let’s Encrypt (Recomendado)

Ejecutar sitios web sobre HTTP simple ya no es aceptable para entornos de producción. HTTPS cifra el tráfico entre tu servidor y los visitantes, mejora las clasificaciones de SEO y es requerido para características modernas del navegador. Let’s Encrypt proporciona certificados SSL/TLS gratuitos y renovables automáticamente.

> ¿Prefieres una solución SSL premium? AlexHost ofrece Certificados SSL confiables para empresas que necesitan validación extendida o cobertura de comodín.

Instalar Certbot

sudo apt install certbot python3-certbot-nginx

Obtener e Instalar Certificados SSL

Ejecuta Certbot para cada dominio. El complemento --nginx modifica automáticamente tu configuración de Nginx para habilitar HTTPS:

sudo certbot --nginx -d example1.com -d www.example1.com
sudo certbot --nginx -d example2.com -d www.example2.com

Sigue los mensajes interactivos. Certbot hará lo siguiente:

  1. Verificar la propiedad del dominio a través del desafío HTTP
  2. Obtener un certificado firmado de Let’s Encrypt
  3. Actualizar automáticamente tu bloque de servidor de Nginx para escuchar en el puerto 443
  4. Configurar redirección de HTTP a HTTPS

Verificar Renovación Automática

Los certificados de Let’s Encrypt expiran cada 90 días. Certbot instala un temporizador systemd para manejar renovaciones automáticamente. Pruébalo con:

sudo certbot renew --dry-run

Si la ejecución de prueba se completa sin errores, tus certificados se renovarán automáticamente sin intervención manual.

Cómo Se Verá Tu Bloque de Servidor Actualizado

Después de que Certbot se ejecute, tu configuración se actualizará automáticamente a algo como esto:

server {
    listen 443 ssl;
    server_name example1.com www.example1.com;

    root /var/www/example1.com/html;
    index index.html;

    ssl_certificate /etc/letsencrypt/live/example1.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        try_files $uri $uri/ =404;
    }
}

server {
    listen 80;
    server_name example1.com www.example1.com;
    return 301 https://$host$request_uri;
}

Solución de Problemas Comunes

Incluso con una configuración cuidadosa, pueden surgir problemas. Aquí están los problemas más comunes y cómo resolverlos:

502 Bad Gateway

Esto típicamente significa que Nginx no puede comunicarse con un servicio backend (p. ej., PHP-FPM o una aplicación Node.js). Verifica que el servicio upstream se está ejecutando y que el socket/puerto en tu configuración es correcto.

403 Forbidden

Usualmente un problema de permisos. Comprueba que www-data es propietario de la raíz web y que los permisos de archivo están configurados correctamente:

sudo chown -R www-data:www-data /var/www/example1.com
sudo chmod -R 755 /var/www/example1.com

404 Not Found

Verifica que la directiva root en tu bloque de servidor apunte al directorio correcto y que index.html exista en esa ruta.

Sitio Incorrecto Cargándose

Si visitar example1.com carga el contenido de example2.com, comprueba que:

  • Cada directiva server_name es única y correcta
  • Los enlaces simbólicos en sites-enabled son válidos: ls -la /etc/nginx/sites-enabled/
  • El sitio predeterminado está deshabilitado si entra en conflicto

Nginx Falla al Iniciar Después de Cambio de Configuración

Siempre ejecuta sudo nginx -t antes de reiniciar. Revisa cuidadosamente la salida del error — te indicará el archivo exacto y la línea que causa el problema.

Verificar Registros

Los registros por sitio (configurados en el Paso 3) son tu mejor recurso de depuración:

sudo tail -f /var/log/nginx/example1.com.error.log
sudo tail -f /var/log/nginx/example1.com.access.log

Consideraciones Avanzadas

Alojar Aplicaciones PHP

Si tus sitios ejecutan PHP (p. ej., WordPress, Laravel), necesitarás instalar PHP-FPM y añadir una directiva fastcgi_pass a tu bloque de servidor:

location ~ .php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}

Usar un Panel de Control

Administrar hosts virtuales de Nginx manualmente a través de la línea de comandos es poderoso pero consume tiempo a escala. Si prefieres una interfaz gráfica, considera el V

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