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
- Requisitos Previos
- Configurar Directorios para Cada Sitio Web
- Crear Contenido HTML de Ejemplo
- Crear Archivos de Configuración de Host Virtual
- Habilitar los Hosts Virtuales
- Probar la Configuración de Nginx
- Reiniciar Nginx para Aplicar Cambios
- Acceder a Tus Sitios Web
- Habilitar HTTPS con Let’s Encrypt (Recomendado)
- Solución de Problemas Comunes
- 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 nginxVerifica la instalación y comprueba que el servicio se está ejecutando:
sudo systemctl status nginxDeberías ver active (running) en la salida. Si no, inicia el servicio manualmente:
sudo systemctl start nginx
sudo systemctl enable nginxNombres 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/htmlLa 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/htmlEsto asegura que Nginx tenga los permisos de lectura necesarios para servir archivos desde estos directorios.
Establecer Permisos de Directorio
sudo chmod -R 755 /var/wwwEl 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.htmlPara example2.com
echo "<h1>Welcome to Example2.com!</h1>" | sudo tee /var/www/example2.com/html/index.htmlEstas 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.comAñ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.comAñ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
| Directiva | Propósito |
|---|---|
listen 80 | Escucha conexiones HTTP entrantes en el puerto 80 |
listen [::]:80 | Habilita soporte IPv6 en el puerto 80 |
server_name | Define qué nombres de dominio maneja este bloque |
root | Establece la raíz del documento — donde se almacenan los archivos del sitio web |
index | Especifica el archivo predeterminado a servir cuando se solicita un directorio |
try_files | Intenta servir el archivo solicitado; devuelve 404 si no se encuentra |
access_log / error_log | Archivos 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/defaultSiempre 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 -tUna prueba exitosa devuelve:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulSi 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 nginxAlternativamente, usa reload para un reinicio elegante que no interrumpa conexiones activas:
sudo systemctl reload nginxPaso 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.comhttp://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/hostsAñ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.comGuarda 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-nginxObtener 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.comsudo certbot --nginx -d example2.com -d www.example2.comSigue los mensajes interactivos. Certbot hará lo siguiente:
- Verificar la propiedad del dominio a través del desafío HTTP
- Obtener un certificado firmado de Let’s Encrypt
- Actualizar automáticamente tu bloque de servidor de Nginx para escuchar en el puerto 443
- 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-runSi 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.com404 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_namees única y correcta - Los enlaces simbólicos en
sites-enabledson 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.logConsideraciones 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
