Guías de instalación

Instalar Nginx y configurar el bloque de servidor

Explicamos cómo instalar Nginx en Ubuntu y crear un server block para su dominio, la configuración del proxy inverso (reverse proxy) para una aplicación Node.js y la solución de los errores frecuentes.

Aurora YazılımEquipo editorial 6 min de lectura
Instalar Nginx y configurar el bloque de servidor
¿Cómo se instala Nginx en Ubuntu?

Para instalar Nginx se ejecutan los comandos sudo apt update y sudo apt install nginx, y se permite el perfil Nginx Full en el cortafuegos. Después se crea en /etc/nginx/sites-available un server block para su dominio, se enlaza a la carpeta sites-enabled, se comprueba con sudo nginx -t y se activa la configuración con sudo systemctl reload nginx.

Qué es Nginx y para qué sirve

Nginx es un servidor web y proxy inverso de código abierto capaz de atender muchas conexiones simultáneas con poca memoria. Sirve archivos estáticos con gran rapidez; se coloca delante de aplicaciones Node.js, Python o PHP y les reenvía las peticiones, termina el SSL y actúa como capa de caché.

Su diferencia básica con Apache es la forma de configurarse: en Nginx no existe el archivo .htaccess por directorio, todas las reglas se mantienen en la configuración central. Esto mejora el rendimiento, pero obliga a quienes vienen de Apache a reescribir sus reglas. Si tiene curiosidad por los equivalentes del lado de Apache, consulte nuestro artículo sobre las redirecciones con htaccess.

Esta guía sigue sobre Ubuntu y Debian; la instalación del entorno de desarrollo para macOS y Windows la encontrará en un apartado aparte.

Requisitos previos

Si en el servidor también está instalado Apache, los dos servicios intentan escuchar el mismo puerto 80 y Nginx no arranca. Detenga y desactive Apache, o haga que escuche en otro puerto.

  • Un servidor con Ubuntu o Debian y un usuario con permisos sudo
  • Que el registro A de su dominio apunte a la IP del servidor
  • Que no haya otro servicio (p. ej., Apache) usando los puertos 80 y 443
  • Si va a montar un proxy inverso, una aplicación en marcha en el servidor (p. ej., Node.js en el puerto 3000)

Pasos para instalar Nginx en Ubuntu

El paquete de Nginx del repositorio propio de Ubuntu recibe con regularidad las actualizaciones de seguridad y es suficiente para la mayoría de los proyectos. Si necesita una versión más reciente de la rama principal, puede añadir el repositorio oficial de paquetes de nginx.org.

bash
sudo apt update
sudo apt install nginx
sudo systemctl enable --now nginx
sudo systemctl status nginx

# Cortafuegos (si utiliza UFW)
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

# Verificación
nginx -v
curl -I http://localhost

Archivos y carpetas importantes

  • /etc/nginx/nginx.conf: archivo de configuración principal
  • /etc/nginx/sites-available/: server blocks definidos
  • /etc/nginx/sites-enabled/: enlaces a los bloques activos
  • /var/www/: carpeta raíz habitual para los archivos del sitio
  • /var/log/nginx/access.log y error.log: registros de peticiones y de errores

Cómo crear un server block

El server block equivale al host virtual de Apache y permite alojar varios dominios en un mismo servidor. Abrir un archivo aparte para cada sitio facilita la administración.

Cree primero la carpeta del sitio y ajuste su propietario; después escriba el archivo de configuración. En la línea server_name añada tanto el dominio sin www como la versión con www; herramientas como Certbot leen esta línea para obtener el certificado.

bash
sudo mkdir -p /var/www/ornek.com/html
sudo chown -R $USER:$USER /var/www/ornek.com/html
echo '<h1>ornek.com funciona</h1>' > /var/www/ornek.com/html/index.html
sudo nano /etc/nginx/sites-available/ornek.com
nginx/etc/nginx/sites-available/ornek.com
server {
    listen 80;
    listen [::]:80;
    server_name ornek.com www.ornek.com;

    root /var/www/ornek.com/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    access_log /var/log/nginx/ornek.com.access.log;
    error_log  /var/log/nginx/ornek.com.error.log;
}
bashActivación y prueba
sudo ln -s /etc/nginx/sites-available/ornek.com /etc/nginx/sites-enabled/
# Si desea desactivar la página de bienvenida predeterminada
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx

Configuración de Nginx como reverse proxy

En lugar de exponer directamente a internet un servidor de aplicaciones Node.js, Python u otro, es un esquema habitual y seguro poner Nginx por delante. Nginx escucha los puertos 80 y 443 y reenvía las peticiones a la aplicación que corre en local; el puerto de la propia aplicación queda cerrado al exterior.

En el ejemplo siguiente la aplicación funciona en el puerto 3000. Para transmitir a la aplicación la IP real del cliente y el protocolo se añaden las cabeceras de proxy; para las aplicaciones que usan WebSocket también hacen falta las cabeceras Upgrade.

Si ejecuta varias aplicaciones en el mismo servidor, lo más ordenado es dar a cada una un subdominio propio y un server block aparte. Por ejemplo, el panel de administración puede publicarse en panel.ornek.com y la API en api.ornek.com; cuando cada bloque tiene su propio archivo de log, también resulta más fácil averiguar de qué aplicación proviene un problema. Para poder leer en la aplicación la IP real del cliente, no olvide activar también el ajuste de proxy de confianza (trust proxy) del framework que utilice.

nginx
server {
    listen 80;
    server_name app.ornek.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        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;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    client_max_body_size 20m;
}

HTTPS, compresión y caché

Una vez que el server block funciona, el siguiente paso es pasar a HTTPS con un certificado gratuito. El complemento de Nginx para Certbot obtiene el certificado y añade por usted el bloque 443 y la redirección; explicamos los pasos en la guía de instalación de un certificado SSL.

En cuanto a la velocidad, la compresión gzip y las cabeceras de caché de larga duración para los archivos estáticos marcan una gran diferencia. Poner el dominio detrás de una CDN como Cloudflare también sirve el contenido estático desde puntos cercanos al visitante; encontrará la instalación en nuestro artículo de instalación de Cloudflare.

  • Si usa huellas de versión en los nombres de archivo (p. ej., app.3f9a.css), puede alargar aún más el tiempo de caché.
  • No guarde en caché los archivos HTML durante mucho tiempo; de lo contrario, las actualizaciones tardarán en llegar al visitante.
nginxdentro del bloque server
gzip on;
gzip_types text/css application/javascript application/json image/svg+xml;

location ~* \.(css|js|webp|avif|png|jpg|svg|woff2)$ {
    expires 30d;
    add_header Cache-Control "public";
}

Ajustes básicos de seguridad

La instalación por defecto funciona, pero antes de publicar, unos pocos ajustes sencillos reducen de forma notable la superficie de ataque. Ninguno requiere software adicional; basta con añadir unas líneas a la configuración.

Lo primero es desactivar server_tokens; así el número de versión de Nginx deja de aparecer en las páginas de error y en las cabeceras. Después añada un bloque predeterminado que atienda las peticiones con dominios no definidos. Este bloque evita que los bots que llegan directamente a la dirección IP de su servidor vean primero su sitio.

También es importante cerrar el acceso a los archivos ocultos. Una carpeta .git o un archivo .env olvidados por error en la carpeta raíz pueden dejar a la vista de todos su código fuente o las contraseñas de su base de datos. Este tipo de filtraciones suelen deberse no a mala intención, sino a una subida hecha con prisas.

Por último, actualice con regularidad los paquetes del servidor y mantenga abiertos solo los puertos que realmente necesite. Aplicar esta lista de control desde cero cada vez que publica un proyecto de diseño web o una plataforma e-commerce reduce en gran medida las sorpresas posteriores.

nginx
# /etc/nginx/nginx.conf, dentro del bloque http
server_tokens off;

# Bloque predeterminado que rechaza los dominios no definidos
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 444;
}

# Dentro del bloque del sitio: bloquear los archivos ocultos
location ~ /\.(?!well-known) {
    deny all;
}

Entorno de desarrollo en macOS y Windows

Aunque el servidor en producción suele ser Linux, probar la configuración en local agiliza su trabajo. En macOS, Nginx instalado con Homebrew escucha por defecto en el puerto 8080 y su archivo de configuración está en la carpeta etc/nginx bajo el prefijo de Homebrew.

Aunque en nginx.org hay una compilación para Windows, la documentación oficial indica que esa versión tiene limitaciones. En Windows, lo más práctico es ejecutar la versión de Linux en Docker o en WSL; así prueba en el mismo entorno que el servidor en producción.

macOS (Homebrew)

bash
brew install nginx
brew services start nginx
nginx -t
# Carpeta de configuración
ls $(brew --prefix)/etc/nginx
curl -I http://localhost:8080

Windows (Docker)

powershell
docker run -d --name web -p 8080:80 nginx
curl.exe -I http://localhost:8080

Errores frecuentes y soluciones

En la depuración, el primer paso es siempre comprobar la sintaxis con sudo nginx -t y después el archivo error.log. La mayoría de los problemas se resuelven con el mensaje de una sola línea que aparece allí.

SíntomaPosible causa y solución
502 Bad GatewayLa aplicación de detrás no está funcionando o el puerto es erróneo; compruebe la aplicación y la dirección de proxy_pass.
403 ForbiddenLos permisos de la carpeta son insuficientes o falta el archivo index; compruebe el propietario y la línea index.
Address already in useOtro servicio usa el puerto 80; búsquelo con ss -tlnp y deténgalo.
conflicting server nameEl mismo server_name está definido en dos bloques; elimine el duplicado.
413 Request Entity Too LargeEl archivo subido supera el límite; aumente el valor de client_max_body_size.
bash
sudo nginx -t
sudo tail -n 50 /var/log/nginx/error.log
sudo ss -tlnp | grep -E ':80|:443'

Preguntas frecuentes

01¿Es mejor Nginx o Apache?

Ambos son servidores maduros y fiables. Nginx destaca con mucho tráfico simultáneo y como proxy inverso, mientras que Apache ofrece flexibilidad en el alojamiento compartido gracias a su compatibilidad con .htaccess. Muchas infraestructuras usan los dos a la vez.

02¿Cuál es la diferencia entre restart y reload?

reload carga la nueva configuración sin cortar las conexiones en curso; es lo que conviene usar en los cambios diarios. restart detiene el servicio por completo y lo vuelve a iniciar, y puede provocar una breve interrupción.

03¿Cuántos sitios puedo alojar en un servidor?

El límite no lo pone Nginx, sino los recursos del servidor. Abriendo un server block aparte para cada dominio puede ejecutar muchos sitios en la misma máquina; a medida que aumenta el tráfico, hay que vigilar el uso de memoria, procesador y disco.

04¿Se puede hacer balanceo de carga con Nginx?

Sí. Si define varios servidores de aplicación en un bloque upstream y redirige a ese grupo con proxy_pass, Nginx reparte las peticiones entre los servidores. El método por defecto es el reparto por turnos; con métodos como least_conn o ip_hash puede cambiar el comportamiento.

Un Nginx bien instalado ofrece una base rápida, segura y capaz de soportar varias aplicaciones. Si desea tratar juntos los ajustes del servidor, la caché y los objetivos de Core Web Vitals, conozca nuestro servicio de velocidad y rendimiento. Para un sistema a medida que funcione en su propio servidor o para soluciones ya listas de Aurora, como el software hotelero, puede contactarnos desde la página de contacto.