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 multi-inquilino, 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 multi-sitio completamente funcional.
> ¿Buscas un servidor Ubuntu confiable para seguir junto? 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.
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 es así, 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 DNS apuntando a la IP del servidor.
> ¿Necesitas un dominio? Registra el tuyo a través de Registro de dominios de AlexHost y gestiona los 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 gestionar el servicio 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 evita 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 todo el documento.
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 los 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 las solicitudes a la raíz de documentos correcta 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 server block — el equivalente de Nginx de un virtual host de Apache. Los sitios habilitados se vinculan 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 server block:
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 server block:
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 — dónde 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 una depuración más fácil |
Paso 4: Habilitar los Virtual Hosts
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 volver a habilitarlo 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 detectar 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 el 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 los Cambios
Una vez que la prueba de configuración sea exitosa, recarga o reinicia Nginx para aplicar tus cambios:
sudo systemctl restart nginxAlternativamente, usa reload para un reinicio elegante que no interrumpa las conexiones activas:
sudo systemctl reload nginxPaso 7: Accede 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 DNS A, 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 necesario para las funciones 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 plugin --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 las indicaciones interactivas. Certbot hará lo siguiente:
- Verificar la propiedad del dominio mediante desafío HTTP
- Obtener un certificado firmado de Let’s Encrypt
- Actualizar automáticamente tu bloque de servidor Nginx para escuchar en el puerto 443
- Configurar la 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 las 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 ninguna 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 (por ejemplo, PHP-FPM o una aplicación Node.js). Verifica que el servicio upstream esté ejecutándose y que el socket/puerto en tu configuración sea correcto.
403 Forbidden
Usualmente un problema de permisos. Verifica que www-data sea 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, verifica que:
- Cada directiva
server_namesea única y correcta - Los enlaces simbólicos en
sites-enabledsean válidos:ls -la /etc/nginx/sites-enabled/ - El sitio predeterminado esté deshabilitado si entra en conflicto
Nginx no inicia después de cambiar la configuración
Siempre ejecuta sudo nginx -t antes de reiniciar. Revisa cuidadosamente la salida de error — te indicará el archivo exacto y la línea que causa el problema.
Verificando 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
Hosting de Aplicaciones PHP
Si tus sitios ejecutan PHP (por ejemplo, WordPress, Laravel), necesitarás instalar PHP-FPM y agregar 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;
}Usando un Panel de Control
Administrar hosts virtuales 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 VPS con cPanel de AlexHost o explora la gama completa de Paneles de Control VPS para encontrar el adecuado para tu flujo de trabajo.
Escalado Más Allá de un VPS Único
A medida que tu tráfico crece, un VPS único puede no ser suficiente. Para cargas de trabajo de alto tráfico e intensivas en recursos, considera actualizar a Servidores Dedicados para recursos garantizados, aislamiento completo de hardware y máximo rendimiento.
Conclusión
Ya has configurado exitosamente hosts virtuales Nginx en Ubuntu, permitiendo que tu servidor aloje múltiples sitios web independientes simultáneamente. Aquí hay un resumen de lo que se logró:
- Creaste directorios de raíz web aislados para cada dominio con propiedad y permisos correctos
- Escribiste configuraciones de bloques de servidor limpias y listas para producción con registros de acceso y error separados
- Habilitaste hosts virtuales usando el patrón basado en enlaces simbólicos de Nginx
sites-available/sites-enabled - Validaste y recargaste la configuración de Nginx de forma segura
- Aseguraste cada sitio con HTTPS usando certificados gratuitos de Let's Encrypt a través de Certbot
Esta configuración es eficiente, escalable y sigue las mejores prácticas de Nginx. Ya sea que estés alojando dos sitios o veinte, se aplica el mismo patrón — simplemente repite el proceso para cada dominio adicional.
Para obtener los mejores resultados, combina esta configuración con un entorno de alojamiento rápido y confiable. Los planes de VPS Hosting de AlexHost están optimizados para cargas de trabajo Linux, incluyen acceso root completo y están respaldados por soporte técnico 24/7 — dándote la base ideal para ejecutar Nginx en producción.
en todos los servicios de hosting