Configurar un servidor web nginx no consiste solo en instalar un paquete y copiar un archivo de ejemplo. Nginx es una pieza central de la infraestructura: recibe peticiones HTTP y HTTPS, decide qué sitio debe responder, sirve archivos estáticos, puede actuar como proxy inverso hacia aplicaciones, comprime contenido, registra actividad y aplica reglas de seguridad.
En esta guía veremos una configuración práctica orientada al servidor web nginx, pensada para administrar uno o varios sitios en un servidor Linux. El objetivo es entender qué hace cada parte, cómo validar los cambios y qué ajustes conviene revisar antes de poner un sitio en producción.
👉 Y recuerda, si quieres aprender más de Linux, pincha en este curso de Linux gratis
👉 También te dejo por aquí una guía de comandos Linux por categorías
Qué es Nginx y para qué se usa
Un servidor web nginx es muy usado para servir páginas estáticas, publicar aplicaciones web y actuar como proxy inverso. A diferencia de un servidor que crea un proceso pesado por cada conexión, Nginx está diseñado con una arquitectura orientada a eventos, lo que le permite manejar muchas conexiones simultáneas con un consumo moderado de recursos.
En una instalación real, Nginx puede cumplir varias funciones:
- Servir archivos HTML, CSS, JavaScript, imágenes y descargas.
- Publicar sitios creados con WordPress, Laravel, Django, Node.js u otros frameworks.
- Redirigir tráfico HTTP a HTTPS.
- Terminar certificados TLS y gestionar conexiones seguras.
- Enviar peticiones a una aplicación interna mediante proxy inverso.
- Aplicar reglas de cache, compresión, límites y cabeceras de seguridad.
- Separar múltiples dominios en un mismo servidor mediante bloques de servidor.
La configuración correcta depende del caso, pero casi todos los despliegues comparten una base común: una estructura clara de archivos, un bloque de servidor por dominio, pruebas antes de recargar el servicio y una política mínima de seguridad.
Instalación de Nginx en Linux
En distribuciones basadas en Debian o Ubuntu, la instalación suele hacerse con apt:
sudo apt update
sudo apt install nginxDespués de instalarlo, conviene comprobar que el servicio está activo:
systemctl status nginxTambién puedes verificar la versión instalada:
nginx -vEn CentOS, Rocky Linux, AlmaLinux o Fedora, el gestor de paquetes puede variar:
sudo dnf install nginx
sudo systemctl enable --now nginxUna vez instalado, abre la IP pública del servidor en el navegador. Si todo funciona, deberías ver la página de bienvenida de Nginx o una respuesta HTTP válida.
Estructura de archivos más habitual
En Debian y Ubuntu, los archivos importantes suelen estar en:
/etc/nginx/
├── nginx.conf
├── sites-available/
├── sites-enabled/
├── conf.d/
└── snippets/El archivo nginx.conf contiene la configuración global. Ahí se definen parámetros generales como usuarios, procesos de trabajo, logs, tipos MIME, compresión y carga de configuraciones adicionales.
La carpeta sites-available se usa para guardar configuraciones de sitios disponibles. La carpeta sites-enabled contiene enlaces simbólicos a los sitios que realmente están activos. Esta separación permite preparar una configuración sin activarla todavía.
Un flujo común es:
- Crear el archivo del sitio en /etc/nginx/sites-available/.
- Crear un enlace simbólico en /etc/nginx/sites-enabled/.
- Probar la sintaxis con nginx -t.
- Recargar Nginx con systemctl reload nginx.
En otras distribuciones puede usarse más la carpeta /etc/nginx/conf.d/, con archivos terminados en .conf. El concepto es el mismo: mantener cada sitio en su propio archivo y evitar mezclar configuraciones no relacionadas.
Configuración básica servidor web nginx
Antes de crear sitios concretos, conviene revisar el archivo principal:
sudo nano /etc/nginx/nginx.confUna configuración global típica incluye directivas como estas:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
gzip_types text/plain text/css application/json application/javascript application/xml image/svg+xml;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}No hace falta modificar este archivo en exceso para un primer despliegue. Lo importante es comprender que el bloque http carga los archivos de configuración de los sitios. Si un sitio no responde, una causa frecuente es que su archivo no esté incluido o no esté enlazado correctamente.
Crear el directorio del sitio
Para servir un sitio estático o una aplicación con archivos públicos, crea una carpeta específica:
sudo mkdir -p /var/www/ejemplo.com/publicAsigna permisos razonables:
sudo chown -R www-data:www-data /var/www/ejemplo.com
sudo find /var/www/ejemplo.com -type d -exec chmod 755 {} \;
sudo find /var/www/ejemplo.com -type f -exec chmod 644 {} \;Puedes añadir un archivo de prueba:
echo "<h1>Servidor Nginx funcionando</h1>" | sudo tee /var/www/ejemplo.com/public/index.htmlEl usuario exacto puede variar según la distribución. En Debian y Ubuntu suele ser www-data; en otras puede ser nginx.
Crear un bloque de servidor web nginx
El bloque de servidor, también llamado server block, indica a Nginx cómo debe responder para un dominio concreto. Crea un archivo:
sudo nano /etc/nginx/sites-available/ejemplo.comUna configuración básica para HTTP sería:
server {
listen 80;
listen [::]:80;
server_name ejemplo.com www.ejemplo.com;
root /var/www/ejemplo.com/public;
index index.html index.htm;
access_log /var/log/nginx/ejemplo.com.access.log;
error_log /var/log/nginx/ejemplo.com.error.log;
location / {
try_files $uri $uri/ =404;
}
}Las directivas principales son:
- listen: indica el puerto y protocolo donde escucha Nginx.
- server_name: define los dominios que atenderá este bloque.
- root: carpeta desde la que se servirán los archivos.
- index: archivos que se buscarán como página inicial.
- location: reglas de manejo para rutas concretas.
- try_files: orden de búsqueda de archivos antes de devolver error.
Después activa el sitio:
sudo ln -s /etc/nginx/sites-available/ejemplo.com /etc/nginx/sites-enabled/Comprueba que no haya errores:
sudo nginx -tSi la prueba es correcta, recarga Nginx:
sudo systemctl reload nginxConfigurar DNS antes de probar el dominio
Para que el dominio apunte al servidor, debes crear registros DNS en el proveedor del dominio:
Tipo A ejemplo.com IP_DEL_SERVIDOR
Tipo A www.ejemplo.com IP_DEL_SERVIDORSi usas IPv6, añade también registros AAAA. La propagación DNS puede tardar desde unos minutos hasta varias horas, aunque en muchos casos es rápida.
Puedes comprobar la resolución con:
dig ejemplo.com
dig www.ejemplo.comSi el dominio no apunta todavía a la IP correcta, Nginx puede estar bien configurado aunque el navegador no llegue al servidor esperado.
Redirección de www a no-www, o al revés
Conviene decidir una versión canónica del dominio. Por ejemplo, si quieres usar ejemplo.com como dominio principal y redirigir www.ejemplo.com, puedes separar los bloques:
server {
listen 80;
listen [::]:80;
server_name www.ejemplo.com;
return 301 http://ejemplo.com$request_uri;
}
server {
listen 80;
listen [::]:80;
server_name ejemplo.com;
root /var/www/ejemplo.com/public;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}Más adelante, cuando actives HTTPS, esa redirección debe apuntar directamente a HTTPS para evitar saltos innecesarios.
Activar HTTPS con Certbot
Un sitio moderno debe usar HTTPS. La forma más habitual de obtener certificados gratuitos de Let’s Encrypt es usar Certbot.
En Ubuntu o Debian:
sudo apt install certbot python3-certbot-nginxDespués ejecuta:
sudo certbot --nginx -d ejemplo.com -d www.ejemplo.comCertbot validará el dominio, solicitará el certificado y puede modificar la configuración de Nginx automáticamente. Al terminar, comprueba la renovación automática:
sudo certbot renew --dry-runUna configuración HTTPS generada o ajustada manualmente suele incluir:
server {
listen 80;
listen [::]:80;
server_name ejemplo.com www.ejemplo.com;
return 301 https://ejemplo.com$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name ejemplo.com;
root /var/www/ejemplo.com/public;
index index.html;
ssl_certificate /etc/letsencrypt/live/ejemplo.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ejemplo.com/privkey.pem;
location / {
try_files $uri $uri/ =404;
}
}La ruta exacta de los certificados depende del dominio usado al generar el certificado.
Configurar Nginx como proxy inverso
Muchas aplicaciones no se sirven como archivos estáticos. Por ejemplo, una app Node.js puede escuchar internamente en el puerto 3000, mientras Nginx recibe el tráfico público en 80 y 443.
Un bloque de proxy inverso básico sería:
server {
listen 80;
listen [::]:80;
server_name app.ejemplo.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;
}
}Estas cabeceras permiten que la aplicación conozca el dominio original, la IP del cliente y el protocolo usado. Son especialmente importantes para frameworks que generan URLs, registran IPs o aplican lógica distinta en HTTP y HTTPS.
Para WebSockets, añade:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";Configurar PHP-FPM para WordPress/otros CMS
Si el servidor va a ejecutar WordPress, Nginx no procesa PHP por sí mismo. Necesita comunicarse con PHP-FPM.
Una configuración típica para WordPress puede ser:
server {
listen 80;
listen [::]:80;
server_name ejemplo.com www.ejemplo.com;
root /var/www/ejemplo.com/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}El socket de PHP-FPM puede cambiar según la versión instalada. Compruébalo con:
ls /run/php/Para WordPress, la línea clave es:
try_files $uri $uri/ /index.php?$args;Permite que las URLs amigables funcionen aunque el archivo solicitado no exista físicamente.
Reglas básicas de seguridad
Una configuración mínima de seguridad debería bloquear archivos sensibles y reducir exposición innecesaria.
Puedes añadir reglas como:
location ~ /\. {
deny all;
}
location ~* \.(bak|config|sql|ini|log|sh|inc|swp)$ {
deny all;
}También puedes ocultar la versión de Nginx en las respuestas:
server_tokens off;Esta directiva suele colocarse dentro del bloque http en nginx.conf.
Para cabeceras de seguridad básicas:
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;La cabecera Content-Security-Policy puede ser muy útil, pero debe configurarse con cuidado para no romper scripts, estilos o recursos externos del sitio.
Compresión y cache de archivos estáticos
La compresión reduce el tamaño de texto, CSS, JavaScript y JSON. Si está activada globalmente con gzip on, puedes complementar con tipos adecuados:
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript application/xml image/svg+xml;Para cachear recursos estáticos en el navegador:
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|webp|woff|woff2)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}Este ajuste mejora la carga para usuarios recurrentes. En sitios con despliegues frecuentes, conviene usar nombres de archivo versionados, como app.8f3a2.css, para evitar que el navegador conserve versiones antiguas.
Logs: dónde mirar cuando algo falla
Nginx registra accesos y errores. Los archivos más comunes son:
/var/log/nginx/access.log
/var/log/nginx/error.logSi configuraste logs por sitio, también tendrás archivos como:
/var/log/nginx/ejemplo.com.access.log
/var/log/nginx/ejemplo.com.error.logPara ver errores en tiempo real:
sudo tail -f /var/log/nginx/error.logPara revisar las últimas líneas de acceso:
sudo tail -n 100 /var/log/nginx/access.logLos logs ayudan a detectar rutas inexistentes, errores de permisos, fallos de proxy, problemas con PHP-FPM y respuestas incorrectas.
Comandos esenciales para administrar Nginx
Estos comandos cubren la mayor parte del trabajo diario:
sudo nginx -t
sudo systemctl reload nginx
sudo systemctl restart nginx
sudo systemctl status nginx
sudo systemctl enable nginx
sudo journalctl -u nginx --no-pager -n 100La diferencia entre reload y restart es importante. reload recarga la configuración sin detener completamente el servicio. Es la opción preferida después de cambios válidos. restart reinicia el servicio completo y puede interrumpir conexiones activas.
Antes de cualquier recarga, usa siempre:
sudo nginx -tSi la sintaxis tiene errores, Nginx indicará el archivo y la línea aproximada.
Problemas comunes y cómo resolverlos
Uno de los errores más frecuentes es ver la página por defecto de Nginx en lugar del sitio. Esto suele ocurrir porque el bloque correcto no está activado, el server_name no coincide o el dominio apunta a otra IP.
Otro problema habitual es recibir un error 403 Forbidden. En ese caso revisa permisos, propietario de archivos y existencia del archivo index. Nginx debe poder entrar en todos los directorios del camino hasta el archivo público.
Si aparece 502 Bad Gateway, normalmente el proxy o PHP-FPM no está respondiendo. Revisa si la aplicación está activa, si el puerto es correcto o si el socket de PHP-FPM existe.
Si HTTPS falla, comprueba que el certificado exista, que las rutas sean correctas, que el puerto 443 esté abierto en el firewall y que el dominio resuelva hacia el servidor.
Firewall y puertos necesarios
Para publicar un sitio web necesitas permitir tráfico en los puertos 80 y 443.
Con UFW:
sudo ufw allow "Nginx Full"
sudo ufw statusTambién puedes permitir los puertos directamente:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcpSi el servidor está en un proveedor cloud, revisa además las reglas del firewall externo o grupo de seguridad. A veces el sistema operativo permite el tráfico, pero el proveedor lo bloquea antes de que llegue a la máquina.
Checklist antes de producción
Antes de considerar lista la configuración, revisa estos puntos:
- El dominio y www apuntan a la IP correcta.
- El bloque de servidor está activo.
- nginx -t no muestra errores.
- HTTP redirige a HTTPS.
- El certificado TLS se renueva correctamente.
- Los logs están separados o son fáciles de auditar.
- Los permisos de archivos no son más amplios de lo necesario.
- Los puertos 80 y 443 están abiertos.
- Los archivos sensibles están bloqueados.
- La aplicación interna o PHP-FPM responden si se usa proxy.
Conclusión
La configuración de un servidor web nginx debe hacerse con método: instalar, crear una estructura clara, definir un bloque de servidor, validar la sintaxis, activar HTTPS, revisar logs y aplicar medidas básicas de seguridad. Una vez entiendes el papel de directivas como server_name, root, location, try_files y proxy_pass, Nginx se vuelve una herramienta flexible para publicar desde sitios estáticos hasta aplicaciones complejas.
La clave es no editar a ciegas. Para configurar un servidor web nginx, cada cambio debe probarse con nginx -t, recargarse con cuidado y verificarse desde el navegador, los logs y la línea de comandos. Así se consigue un servidor web nginx estable, mantenible y preparado para crecer.

