Nginx es uno de los servidores web más utilizados gracias a su rendimiento, bajo consumo de recursos y capacidad para atender muchas conexiones simultáneas. Puede servir páginas estáticas, actuar como proxy inverso y distribuir peticiones hacia aplicaciones escritas en Node.js, Python, PHP u otras tecnologías.
Configurar tu propio servidor web con Nginx es un paso fundamental si quieres alojar sitios o aplicaciones en un VPS y mantener el control sobre su funcionamiento.
En este tutorial aprenderás a instalar Nginx en Ubuntu Server, abrir el firewall, crear un bloque de servidor para tu dominio, activar HTTPS y resolver los problemas más habituales.
Qué vamos a configurar
Al terminar tendrás un servidor con esta estructura:
- Nginx instalado y configurado para iniciarse automáticamente.
- Puertos HTTP y HTTPS permitidos en el firewall.
- Un directorio independiente para los archivos de tu sitio.
- Un bloque de servidor asociado a tu dominio.
- Una configuración comprobada antes de aplicarla.
- HTTPS mediante un certificado gratuito.
Los pasos están orientados a Ubuntu Server 22.04 o 24.04, pero son muy similares en otras distribuciones basadas en Debian.
Requisitos previos
Necesitas lo siguiente:
- Un VPS o servidor con Ubuntu y una dirección IP pública.
- Un usuario con permisos de
sudo. - Acceso al servidor mediante SSH.
- Un dominio, si quieres publicar el sitio con un nombre y activar HTTPS.
- Acceso al panel DNS del dominio.
Si todavía no tienes servidor, consulta nuestra guía sobre cómo elegir un proveedor de VPS. Para acceder de forma segura, sigue el tutorial sobre cómo conectarte a un servidor por SSH.
1. Actualizar el sistema
Conéctate por SSH y actualiza el índice de paquetes. Después instala las actualizaciones disponibles:
sudo apt update
sudo apt upgrade -y
Actualizar antes de instalar reduce la posibilidad de utilizar paquetes obsoletos y aplica correcciones de seguridad pendientes. Si el sistema actualiza el kernel, puede ser recomendable reiniciar:
sudo reboot
La conexión SSH se cerrará. Espera unos segundos y vuelve a entrar.
2. Instalar Nginx
Nginx está disponible en los repositorios oficiales de Ubuntu. Instálalo con:
sudo apt install nginx -y
El servicio normalmente se inicia de forma automática. Comprueba su estado:
sudo systemctl status nginx
Deberías ver active (running). Pulsa q para salir de la vista de estado.
También puedes verificar la respuesta desde el propio servidor:
curl -I http://localhost
Una respuesta con el estado 200 OK confirma que Nginx está atendiendo peticiones HTTP.
3. Configurar el firewall
Ubuntu utiliza habitualmente UFW para gestionar reglas sencillas de firewall. Antes de activarlo, permite las conexiones SSH para no perder el acceso remoto:
sudo ufw allow OpenSSH
Nginx instala varios perfiles. Puedes verlos con:
sudo ufw app list
Para permitir HTTP y HTTPS, utiliza el perfil completo:
sudo ufw allow 'Nginx Full'
Si UFW todavía está desactivado, actívalo y comprueba las reglas:
sudo ufw enable
sudo ufw status
El resultado debe mostrar permisos para OpenSSH y Nginx Full. Si administras el firewall desde el panel del proveedor, también tendrás que permitir los puertos TCP 80 y 443 allí.
4. Comprobar la página predeterminada
Abre un navegador y visita la dirección IP del servidor:
http://IP_DEL_SERVIDOR
Si aparece la página de bienvenida de Nginx, la instalación básica funciona. Si no carga, revisa lo siguiente:
- Que el servicio esté activo con
sudo systemctl status nginx. - Que UFW permita el tráfico web.
- Que el firewall del proveedor tenga abiertos los puertos necesarios.
- Que la dirección IP utilizada sea la pública del servidor.
5. Entender los archivos principales de Nginx
| Ruta | Función |
|---|---|
/etc/nginx/nginx.conf | Configuración principal de Nginx |
/etc/nginx/sites-available/ | Configuraciones disponibles para sitios |
/etc/nginx/sites-enabled/ | Sitios activados mediante enlaces simbólicos |
/var/www/html/ | Directorio de la página predeterminada |
/var/log/nginx/access.log | Registro de peticiones recibidas |
/var/log/nginx/error.log | Errores y avisos del servidor |
En Ubuntu es habitual crear un archivo independiente dentro de sites-available para cada dominio y activarlo desde sites-enabled.
6. Crear el directorio del sitio
En los ejemplos utilizaremos ejemplo.com. Sustitúyelo siempre por tu dominio real.
sudo mkdir -p /var/www/ejemplo.com/html
sudo chown -R $USER:$USER /var/www/ejemplo.com/html
sudo chmod -R 755 /var/www/ejemplo.com
Crea una página sencilla para comprobar el nuevo sitio:
nano /var/www/ejemplo.com/html/index.html
Añade este contenido:
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mi sitio con Nginx</title>
</head>
<body>
<h1>Nginx funciona correctamente</h1>
<p>Tu nuevo servidor web ya está sirviendo este sitio.</p>
</body>
</html>
En Nano, guarda con Ctrl + O, confirma con Enter y cierra con Ctrl + X.
7. Crear un bloque de servidor
Un bloque server indica a Nginx qué dominio debe atender y dónde se encuentran sus archivos. Crea una configuración nueva:
sudo nano /etc/nginx/sites-available/ejemplo.com
Introduce lo siguiente, cambiando el dominio:
server {
listen 80;
listen [::]:80;
server_name ejemplo.com www.ejemplo.com;
root /var/www/ejemplo.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
listen define el puerto, server_name identifica los dominios, root señala el directorio público y try_files controla cómo se buscan los archivos solicitados.
8. Activar el sitio y probar la configuración
Crea un enlace simbólico en sites-enabled:
sudo ln -s /etc/nginx/sites-available/ejemplo.com /etc/nginx/sites-enabled/
Antes de aplicar cambios, comprueba siempre la sintaxis:
sudo nginx -t
Si el resultado indica que la sintaxis es correcta y la prueba ha sido satisfactoria, recarga Nginx:
sudo systemctl reload nginx
Recargar es preferible a reiniciar cuando solo cambias la configuración, porque Nginx puede aplicar los cambios de forma ordenada sin interrumpir las conexiones activas.
Si no vas a utilizar el sitio predeterminado, puedes desactivarlo:
sudo unlink /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
9. Apuntar el dominio al servidor
En el panel DNS de tu dominio crea estos registros:
| Tipo | Nombre | Valor |
|---|---|---|
| A | @ | IP pública del servidor |
| A | www | IP pública del servidor |
Si utilizas IPv6, añade también registros AAAA con la dirección correspondiente. Los cambios DNS pueden tardar en propagarse.
Puedes comprobar la resolución desde tu equipo con:
nslookup ejemplo.com
Cuando el dominio devuelva la IP correcta, visita http://ejemplo.com. Deberías ver la página creada anteriormente.
10. Activar HTTPS con Certbot
No solicites el certificado hasta que el dominio apunte correctamente al servidor y el puerto 80 sea accesible. Instala Certbot:
sudo snap install --classic certbot
Solicita el certificado utilizando el complemento de Nginx:
sudo certbot --nginx -d ejemplo.com -d www.ejemplo.com
Certbot comprobará el dominio, instalará el certificado y adaptará el bloque del servidor. Durante el proceso podrás elegir la redirección automática de HTTP a HTTPS.
Comprueba la renovación automática:
sudo certbot renew --dry-run
Después visita https://ejemplo.com y verifica que el navegador muestra una conexión segura.
11. Usar Nginx como proxy inverso
Si tu aplicación funciona en un puerto interno, por ejemplo Node.js en 127.0.0.1:3000, Nginx puede recibir las peticiones públicas y reenviarlas.
Sustituye el bloque location / por:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Después prueba y recarga:
sudo nginx -t
sudo systemctl reload nginx
La aplicación debe escuchar solo en la interfaz interna cuando no necesite acceso directo desde internet.
12. Comandos habituales de administración
| Comando | Acción |
|---|---|
sudo systemctl status nginx | Consultar el estado |
sudo systemctl start nginx | Iniciar el servicio |
sudo systemctl stop nginx | Detener el servicio |
sudo systemctl restart nginx | Reiniciar completamente |
sudo systemctl reload nginx | Recargar la configuración |
sudo systemctl enable nginx | Activar el inicio automático |
sudo nginx -t | Comprobar sintaxis y archivos referenciados |
nginx -v | Mostrar la versión instalada |
13. Revisar registros y solucionar errores
Los registros suelen explicar por qué un sitio no responde correctamente:
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
Para consultar eventos del servicio:
sudo journalctl -u nginx --since "10 minutes ago"
Error 403 Forbidden
Comprueba la ruta indicada en root, la existencia del archivo de inicio y los permisos de los directorios. El proceso de Nginx debe poder leer los archivos.
Error 404 Not Found
Revisa que la URL corresponda a un archivo real dentro del directorio configurado y que try_files sea adecuado para tu aplicación.
Error 502 Bad Gateway
Cuando utilizas proxy inverso, este error suele indicar que la aplicación no está funcionando, escucha en otro puerto o rechaza la conexión. Comprueba primero el servicio de la aplicación.
Nginx no se inicia
Ejecuta sudo nginx -t. También verifica si otro programa está utilizando los puertos 80 o 443:
sudo ss -ltnp | grep -E ':80|:443'
14. Seguridad y mantenimiento
- Instala actualizaciones de seguridad con regularidad.
- Utiliza claves SSH y evita administrar el servidor como root.
- Mantén abiertos únicamente los puertos necesarios.
- Prueba la configuración con
nginx -tantes de recargar. - Realiza copias de
/etc/nginxy del contenido de tus sitios. - Revisa los registros y configura alertas para errores repetidos.
- Utiliza HTTPS y comprueba periódicamente la renovación del certificado.
- Protege y actualiza también la aplicación situada detrás de Nginx.
Nginx no sustituye la seguridad del sistema operativo ni la de la aplicación. El servidor debe mantenerse como un conjunto.
15. Mejoras básicas de rendimiento
La configuración predeterminada suele funcionar bien. Optimiza solo después de medir y evita copiar ajustes sin entenderlos.
- Comprime respuestas de texto con gzip cuando sea apropiado.
- Configura caché para archivos estáticos con versiones en el nombre.
- Reduce el tamaño de imágenes y utiliza formatos modernos.
- Activa HTTP/2 o HTTP/3 únicamente con una configuración TLS correcta.
- Supervisa CPU, memoria, disco, latencia y tiempos de respuesta.
Para archivos estáticos puedes añadir, dentro del bloque del servidor, una política sencilla:
location ~* \.(css|js|jpg|jpeg|png|gif|svg|webp|ico)$ {
expires 7d;
add_header Cache-Control "public";
}
Después de cualquier cambio, ejecuta sudo nginx -t y recarga el servicio.
Checklist final
- Nginx está activo y habilitado al arrancar.
- Los puertos 80 y 443 están permitidos.
- El dominio apunta a la IP correcta.
- El bloque de servidor utiliza el dominio y la ruta adecuados.
sudo nginx -ttermina sin errores.- HTTP redirige a HTTPS.
- La renovación de Certbot supera la prueba.
- Existen copias de seguridad de configuración y contenido.
- Los registros no muestran errores repetidos.
Conclusión
Ya tienes los pasos necesarios para instalar Nginx, publicar un sitio independiente y protegerlo con HTTPS. La práctica más importante es comprobar siempre la configuración antes de aplicarla y revisar los registros cuando algo falla.
A partir de esta base puedes alojar varias webs, conectar aplicaciones mediante proxy inverso o añadir caché y balanceo. Avanza poco a poco, documenta cada cambio y conserva una copia de la última configuración que funcionaba.
Para ampliar información, consulta la guía de instalación de Nginx de Ubuntu Server y la guía oficial para principiantes de Nginx.