Tu servidor web con Nginx
Básico
Los pasos marcados en azul cambian según tu sistema.
Tu blog, la documentación de tu proyecto, la web de la asociación del barrio: todo eso puede vivir en un servidor tuyo, sin plataformas que decidan por ti qué se publica, cómo se ve o qué datos se recogen de quien lo visita. Para servirlo, Nginx es la opción más extendida: ligero, rápido y capaz de atender miles de visitas con muy poca memoria.
En este tutorial lo instalarás, abrirás el cortafuegos, publicarás tu primer sitio con su propio dominio y verás cómo usarlo como puerta de entrada a las aplicaciones que alojes. Elige tu sistema en el desplegable de arriba: los pasos cambian un poco entre Ubuntu y Debian y la familia de AlmaLinux.
Lo que necesitas
- Un servidor con un usuario con
sudoy el cortafuegos activo. Si partes de cero, sigue antes los primeros pasos de un servidor Linux. - Para el paso del sitio propio, un dominio (en los ejemplos,
ejemplo.org) cuyo registro DNS de tipo A apunte a la IP de tu servidor. Para probar la instalación te basta con la IP.
Paso 1: instalar Nginx
Ubuntu
sudo apt update
sudo apt install nginx
En Ubuntu, Nginx arranca solo nada más instalarse.
Debian
sudo apt update
sudo apt install nginx
En Debian, Nginx arranca solo nada más instalarse.
AlmaLinux / Rocky
sudo dnf install nginx
sudo systemctl enable --now nginx
En AlmaLinux y Rocky hay que arrancarlo y activarlo a mano; enable --now hace las dos cosas.
Comprueba que está en marcha:
systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Sun 2026-10-18 11:02:41 CEST; 12s ago
Paso 2: abrir el cortafuegos
La web se sirve por el puerto 80 (HTTP) y, cuando tengas certificado, por el 443 (HTTPS). De momento basta con el 80.
Ubuntu
Nginx deja tres perfiles en UFW: Nginx HTTP (puerto 80), Nginx HTTPS (443) y Nginx Full (los dos). Abre solo el primero por ahora:
sudo ufw allow 'Nginx HTTP'
Debian
Nginx deja tres perfiles en UFW: Nginx HTTP (puerto 80), Nginx HTTPS (443) y Nginx Full (los dos). Abre solo el primero por ahora:
sudo ufw allow 'Nginx HTTP'
AlmaLinux / Rocky
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
Paso 3: comprobar que responde
Averigua la IP de tu servidor:
hostname -I
Y ábrela en el navegador: http://203.0.113.10 (con la tuya). Si ves la página de bienvenida de Nginx, el servidor web funciona. Desde la terminal también puedes comprobarlo:
curl -I http://203.0.113.10
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/html
Paso 4: manejar el servicio
Estas son las órdenes que más usarás:
sudo systemctl reload nginx: aplica cambios de configuración sin cortar las conexiones abiertas. Es la que usarás casi siempre.sudo systemctl restart nginx: para y vuelve a arrancar el servicio. Para cambios más profundos.sudo systemctl stop nginxysudo systemctl start nginx: pararlo y arrancarlo.sudo systemctl disable nginxysudo systemctl enable nginx: que no arranque, o que sí, al encender el servidor.
Y antes de cualquier reload, comprueba siempre la configuración:
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Si hay un error, te dirá el archivo y la línea, y el sitio seguirá funcionando con la configuración anterior.
Paso 5: tu primer sitio
Nginx puede servir varios sitios a la vez desde el mismo servidor, cada uno con su dominio. Cada sitio necesita una carpeta con sus archivos y un bloque de configuración (server block) que diga qué dominio responde con qué carpeta.
La carpeta del sitio
Crea la carpeta, hazte propietario de ella para poder editarla sin sudo y deja que Nginx pueda leerla:
sudo mkdir -p /var/www/ejemplo.org/html
sudo chown -R $USER:$USER /var/www/ejemplo.org/html
sudo chmod -R 755 /var/www/ejemplo.org
Dentro, una página de prueba:
nano /var/www/ejemplo.org/html/index.html
/var/www/ejemplo.org/html/index.html
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>ejemplo.org</title>
</head>
<body>
<h1>Esta web vive en mi servidor</h1>
<p>Servida con Nginx, sin intermediarios.</p>
</body>
</html>
El bloque de configuración
Ubuntu
En Ubuntu, cada sitio tiene su archivo en /etc/nginx/sites-available/, y se activa con un enlace en /etc/nginx/sites-enabled/. Crea el tuyo:
sudo nano /etc/nginx/sites-available/ejemplo.org
/etc/nginx/sites-available/ejemplo.org
server {
listen 80;
listen [::]:80;
server_name ejemplo.org www.ejemplo.org;
root /var/www/ejemplo.org/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Actívalo con el enlace:
sudo ln -s /etc/nginx/sites-available/ejemplo.org /etc/nginx/sites-enabled/
Debian
En Debian, cada sitio tiene su archivo en /etc/nginx/sites-available/, y se activa con un enlace en /etc/nginx/sites-enabled/. Crea el tuyo:
sudo nano /etc/nginx/sites-available/ejemplo.org
/etc/nginx/sites-available/ejemplo.org
server {
listen 80;
listen [::]:80;
server_name ejemplo.org www.ejemplo.org;
root /var/www/ejemplo.org/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Actívalo con el enlace:
sudo ln -s /etc/nginx/sites-available/ejemplo.org /etc/nginx/sites-enabled/
AlmaLinux / Rocky
En AlmaLinux y Rocky, Nginx carga todos los archivos .conf de /etc/nginx/conf.d/. Crea el tuyo:
sudo nano /etc/nginx/conf.d/ejemplo.org.conf
/etc/nginx/conf.d/ejemplo.org.conf
server {
listen 80;
listen [::]:80;
server_name ejemplo.org www.ejemplo.org;
root /var/www/ejemplo.org/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
SELinux solo deja a Nginx leer archivos con la etiqueta de contenido web. Los que creas dentro de /var/www la heredan, pero si alguna vez copias archivos desde otro sitio, devuélvesela con sudo restorecon -R /var/www/ejemplo.org.
Qué dice cada línea:
listen: el puerto en el que escucha, en IPv4 y en IPv6.server_name: los dominios que atiende este bloque.rooteindex: la carpeta del sitio y el archivo que se sirve por defecto.try_files: busca el archivo pedido; si no existe, responde con un error 404.
Comprueba y recarga:
sudo nginx -t
sudo systemctl reload nginx
Visita http://ejemplo.org y verás tu página.
Si
nginx -tse queja deserver_names_hash_bucket_size, es que tienes nombres de dominio largos. Abre/etc/nginx/nginx.confy, dentro del bloquehttp, quita el#de la líneaserver_names_hash_bucket_size 64;(o añádela si no existe).
Dónde está cada cosa
/etc/nginx/nginx.conf: la configuración general./etc/nginx/sites-available/y/etc/nginx/sites-enabled/(Debian y Ubuntu) o/etc/nginx/conf.d/(AlmaLinux y Rocky): los sitios./var/log/nginx/access.log: cada visita, una línea./var/log/nginx/error.log: los errores. Es lo primero que mirar cuando algo no funciona.
Para ver las visitas en directo: sudo tail -f /var/log/nginx/access.log.
Extra: la puerta de entrada a tus aplicaciones
Muchas aplicaciones que puedes alojar (una nube como Nextcloud, un gestor de contraseñas, un panel de estadísticas…) traen su propio servidor web, que escucha en un puerto interno como el 3000 o el 8080. Lo habitual es no exponer ese puerto y poner Nginx delante como proxy inverso: recibe las visitas en el 80 y el 443 y se las pasa a la aplicación.
Un bloque mínimo para una aplicación que escucha en 127.0.0.1:3000:
/etc/nginx/sites-available/app.ejemplo.org
server {
listen 80;
listen [::]:80;
server_name app.ejemplo.org;
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;
}
}
Las cabeceras proxy_set_header le cuentan a la aplicación quién la visita de verdad y con qué dominio, que de otra forma solo vería a Nginx. En AlmaLinux y Rocky, además, SELinux no deja a Nginx conectarse a otros puertos hasta que lo permites con sudo setsebool -P httpd_can_network_connect 1.
Siguiente paso
Tu servidor ya sirve webs. El siguiente paso es imprescindible: cifrar las visitas con HTTPS, gratis y renovándose solo, con Let’s Encrypt.
