Laboratorio
Básico
cableando
Tu servidor web con Nginx

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 sudo y 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 nginx y sudo systemctl start nginx: pararlo y arrancarlo.
  • sudo systemctl disable nginx y sudo 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.
  • root e index: 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 -t se queja de server_names_hash_bucket_size, es que tienes nombres de dominio largos. Abre /etc/nginx/nginx.conf y, dentro del bloque http, quita el # de la línea server_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.

X LinkedIn
¿Te ha resultado útil?

Sigue leyendo

HTTPS gratis con Let’s Encrypt

Tutorial / Sistemas

HTTPS gratis con Let’s Encrypt

Cifra tu web en cinco minutos y olvídate: certificado gratuito de Let's Encrypt con Certbot y Nginx, que se renueva solo cada 90 días.

/5 min

Primeros pasos con un servidor Linux

Tutorial / Sistemas

Primeros pasos con un servidor Linux

Diez minutos que te ahorran disgustos: actualizar, crear tu usuario, activar el cortafuegos y preparar SSH en Ubuntu, Debian o AlmaLinux.

/7 min

SSH a fondo: claves, servidor y túneles

Tutorial / Sistemas

SSH a fondo: claves, servidor y túneles

Entra en tus servidores sin contraseñas, blinda sshd en unas pocas líneas y usa túneles para llegar a lo que no quieres exponer.

/16 min