Instalación y Configuración de Nginx en Linux: Guía Completa
Introducción
Nginx (pronunciado "engine-x") es un servidor web de alto rendimiento de código abierto, servidor proxy inverso y balanceador de carga. Originalmente creado por Igor Sysoev en 2004 para resolver el problema C10K (manejar 10,000 conexiones concurrentes), Nginx se ha convertido en uno de los servidores web más populares del mundo, alimentando algunos de los sitios web más grandes y con mayor tráfico en internet.
A diferencia de los servidores web tradicionales que usan un modelo de proceso-por-solicitud o hilo-por-solicitud, Nginx usa una arquitectura asíncrona basada en eventos. Este diseño le permite manejar miles de conexiones concurrentes con una huella de memoria mínima y un rendimiento excepcional. Nginx sobresale en servir contenido estático, actuar como proxy inverso, balanceo de carga, caché y manejar terminación SSL/TLS.
Esta guía completa cubre todo lo que necesitas saber sobre instalar, configurar, optimizar y asegurar Nginx en varias distribuciones de Linux. Ya sea que estés configurando un sitio web estático simple, una arquitectura compleja de microservicios o una aplicación de alto tráfico, esta guía proporciona la base que necesitas para un despliegue exitoso de Nginx.
Requisitos Previos
Antes de instalar Nginx, asegúrate de tener:
- Un servidor Linux ejecutando Ubuntu 20.04/22.04/24.04, Debian 10/11/12, CentOS 7/8, Rocky Linux 8/9 o AlmaLinux 8/9
- Acceso root o una cuenta de usuario con privilegios sudo
- Una conexión a internet estable para descargar paquetes
- Familiaridad básica con la línea de comandos de Linux
- Acceso al firewall (puertos 80 para HTTP y 443 para HTTPS)
- Al menos 512 MB de RAM (se recomienda 1 GB+ para producción)
- Mínimo 500 MB de espacio libre en disco
- Un nombre de dominio registrado (opcional, pero recomendado para producción)
- Comprensión básica de la configuración DNS
- Conocimiento de editores de texto (nano, vim u otro)
Instalación de Nginx en Ubuntu y Debian
Instalar Nginx en sistemas basados en Debian es sencillo usando el gestor de paquetes APT.
Actualizar Repositorio de Paquetes
Comienza actualizando tus listas de paquetes:
sudo apt update
sudo apt upgrade -y
Instalar Nginx
Instala Nginx desde el repositorio oficial:
sudo apt install nginx -y
Este comando instala Nginx junto con todas las dependencias necesarias y crea automáticamente el usuario y grupo nginx.
Instalar desde el Repositorio Oficial de Nginx (Opcional)
Para la última versión estable o mainline, agrega el repositorio oficial de Nginx:
# Instalar prerequisitos
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring -y
# Importar clave de firma de Nginx
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
# Agregar repositorio para versión estable
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
# Actualizar e instalar
sudo apt update
sudo apt install nginx -y
Verificar Instalación
Verifica la versión instalada:
nginx -v
Salida esperada:
nginx version: nginx/1.24.0
Iniciar y Habilitar Nginx
Inicia el servicio Nginx y habilítalo para que se lance al iniciar el sistema:
sudo systemctl start nginx
sudo systemctl enable nginx
Verificar Estado del Servicio
Verifica que Nginx esté en ejecución:
sudo systemctl status nginx
Deberías ver "active (running)" en la salida.
Instalación de Nginx en CentOS, Rocky Linux y AlmaLinux
Instalar Nginx en distribuciones basadas en Red Hat sigue un proceso similar:
Actualizar Repositorio de Paquetes
Actualiza los paquetes de tu sistema:
sudo yum update -y # Para CentOS 7
# O
sudo dnf update -y # Para CentOS 8, Rocky Linux, AlmaLinux
Instalar Nginx desde el Repositorio EPEL
Habilita primero el repositorio EPEL:
# CentOS 7
sudo yum install epel-release -y
# CentOS 8, Rocky Linux, AlmaLinux
sudo dnf install epel-release -y
Instala Nginx:
# CentOS 7
sudo yum install nginx -y
# CentOS 8, Rocky Linux, AlmaLinux
sudo dnf install nginx -y
Instalar desde el Repositorio Oficial de Nginx (Recomendado)
Para la última versión, usa el repositorio oficial de Nginx:
# Crear archivo de repositorio
sudo nano /etc/yum.repos.d/nginx.repo
Agrega el siguiente contenido:
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
Instala Nginx:
# CentOS 7
sudo yum install nginx -y
# CentOS 8, Rocky Linux, AlmaLinux
sudo dnf install nginx -y
Verificar Instalación
Verifica la versión:
nginx -v
Iniciar y Habilitar Nginx
Inicia y habilita el servicio:
sudo systemctl start nginx
sudo systemctl enable nginx
Verificar Estado del Servicio
Verifica que el servicio esté en ejecución:
sudo systemctl status nginx
Configuración del Firewall
Configura tu firewall para permitir tráfico web:
Ubuntu y Debian (UFW)
Si usas UFW:
# Permitir HTTP y HTTPS
sudo ufw allow 'Nginx Full'
# O permitir puertos específicos
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Habilitar UFW si no está ya habilitado
sudo ufw enable
# Verificar estado
sudo ufw status
Nginx proporciona tres perfiles de aplicación UFW:
Nginx HTTP- Solo puerto 80Nginx HTTPS- Solo puerto 443Nginx Full- Ambos puertos 80 y 443
CentOS, Rocky Linux y AlmaLinux (firewalld)
Si usas firewalld:
# Permitir servicios HTTP y HTTPS
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# O permitir puertos específicos
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
# Recargar firewall
sudo firewall-cmd --reload
# Verificar reglas
sudo firewall-cmd --list-all
Probando la Instalación de Nginx
Verifica que Nginx esté sirviendo contenido:
Probar desde Línea de Comandos
Usa curl para probar localmente:
curl localhost
Deberías ver salida HTML de la página de bienvenida predeterminada de Nginx.
Probar desde Navegador Web
Abre un navegador web y navega a:
http://your_server_iphttp://your_domain.com(si el DNS está configurado)
Deberías ver la página predeterminada "Welcome to nginx!".
Verificar Proceso de Nginx
Verifica que los procesos de Nginx estén en ejecución:
ps aux | grep nginx
Deberías ver un proceso maestro y varios procesos trabajadores.
Estructura de Directorios de Nginx
Comprender la organización de archivos de Nginx es esencial:
Estructura de Ubuntu y Debian
/etc/nginx/
├── nginx.conf # Archivo de configuración principal
├── sites-available/ # Configuraciones de bloques de servidor disponibles
├── sites-enabled/ # Bloques de servidor habilitados (enlaces simbólicos)
├── conf.d/ # Archivos de configuración adicionales
├── snippets/ # Fragmentos de configuración
└── modules-enabled/ # Módulos habilitados
/var/www/html/ # Raíz de documentos predeterminada
/var/log/nginx/ # Archivos de registro
├── access.log # Registros de acceso
└── error.log # Registros de errores
/usr/share/nginx/html/ # Raíz web predeterminada (algunas instalaciones)
Estructura de CentOS, Rocky Linux y AlmaLinux
/etc/nginx/
├── nginx.conf # Archivo de configuración principal
├── conf.d/ # Archivos de configuración adicionales (*.conf)
└── default.d/ # Configuración del servidor predeterminado
/usr/share/nginx/html/ # Raíz de documentos predeterminada
/var/log/nginx/ # Archivos de registro
├── access.log # Registros de acceso
└── error.log # Registros de errores
Conceptos Básicos de Configuración de Nginx
Exploremos la sintaxis y estructura de configuración de Nginx:
Archivo de Configuración Principal
El archivo de configuración principal es /etc/nginx/nginx.conf. Aquí hay una estructura típica:
# Usuario y procesos trabajadores
user nginx;
worker_processes auto;
# Ubicación del registro de errores
error_log /var/log/nginx/error.log warn;
# Archivo PID
pid /var/run/nginx.pid;
# Bloque de eventos
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
# Bloque HTTP
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Formato de registro
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
# Configuración de rendimiento
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# Compresión Gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml text/javascript
application/json application/javascript application/xml+rss
application/rss+xml font/truetype font/opentype
application/vnd.ms-fontobject image/svg+xml;
# Incluir bloques de servidor
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*; # Ubuntu/Debian
}
Entendiendo los Contextos de Configuración
La configuración de Nginx usa una estructura jerárquica con contextos:
- Contexto principal - Configuración global
- Contexto de eventos - Procesamiento de conexiones
- Contexto HTTP - Configuración específica de HTTP
- Contexto de servidor - Definiciones de host virtuales
- Contexto de ubicación - Configuración específica de URI
Directivas Básicas Explicadas
# worker_processes: Número de procesos trabajadores (auto = núcleos de CPU)
worker_processes auto;
# worker_connections: Conexiones máximas por trabajador
worker_connections 1024;
# sendfile: Transferencia eficiente de archivos
sendfile on;
# tcp_nopush: Enviar encabezados en un paquete
tcp_nopush on;
# tcp_nodelay: Deshabilitar algoritmo de Nagle para conexiones en tiempo real
tcp_nodelay on;
# keepalive_timeout: Tiempo de espera de keep-alive de conexión del cliente
keepalive_timeout 65;
# client_max_body_size: Tamaño máximo de carga
client_max_body_size 20M;
Creando un Bloque de Servidor (Host Virtual)
Los bloques de servidor permiten alojar múltiples sitios web en un servidor:
Bloque de Servidor para Ubuntu y Debian
Crea una nueva configuración de bloque de servidor:
sudo nano /etc/nginx/sites-available/example.com
Agrega la siguiente configuración:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
access_log /var/log/nginx/example.com-access.log;
error_log /var/log/nginx/example.com-error.log;
location / {
try_files $uri $uri/ =404;
}
# Denegar acceso a archivos ocultos
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# Almacenar en caché archivos estáticos
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
Crea la raíz de documentos:
sudo mkdir -p /var/www/example.com/html
Crea un archivo de índice de prueba:
sudo nano /var/www/example.com/html/index.html
Agrega:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bienvenido a Example.com</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 800px;
margin: 50px auto;
padding: 20px;
text-align: center;
}
h1 { color: #009639; }
</style>
</head>
<body>
<h1>¡Éxito! ¡Nginx está funcionando!</h1>
<p>Este es el host virtual example.com.</p>
</body>
</html>
Establece los permisos apropiados:
sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 755 /var/www/example.com
Habilita el bloque de servidor creando un enlace simbólico:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
Prueba la configuración:
sudo nginx -t
Recarga Nginx:
sudo systemctl reload nginx
Bloque de Servidor para CentOS, Rocky Linux y AlmaLinux
Crea una configuración de bloque de servidor:
sudo nano /etc/nginx/conf.d/example.com.conf
Agrega:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /usr/share/nginx/example.com/html;
index index.html index.htm;
access_log /var/log/nginx/example.com-access.log;
error_log /var/log/nginx/example.com-error.log;
location / {
try_files $uri $uri/ =404;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
Crea directorios y archivos:
sudo mkdir -p /usr/share/nginx/example.com/html
sudo nano /usr/share/nginx/example.com/html/index.html
Establece permisos:
sudo chown -R nginx:nginx /usr/share/nginx/example.com
sudo chmod -R 755 /usr/share/nginx/example.com
En sistemas habilitados con SELinux:
sudo chcon -R -t httpd_sys_content_t /usr/share/nginx/example.com/
Prueba y recarga:
sudo nginx -t
sudo systemctl reload nginx
Configuraciones Avanzadas de Bloques de Ubicación
Los bloques de ubicación definen cómo Nginx maneja diferentes URIs:
Coincidencia Exacta
# Coincidencia exacta - máxima prioridad
location = /favicon.ico {
access_log off;
log_not_found off;
}
Coincidencia de Prefijo
# Coincidencia de prefijo
location /images/ {
root /var/www/example.com;
autoindex on;
}
Coincidencia de Expresión Regular
# Coincidencia de regex sensible a mayúsculas
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
# Coincidencia de regex insensible a mayúsculas
location ~* \.(jpg|jpeg|png|gif|ico)$ {
expires 30d;
}
Coincidencia de Prefijo Preferencial
# Coincidencia de prefijo preferencial - mayor prioridad que regex
location ^~ /static/ {
root /var/www;
}
Orden de Prioridad de Ubicaciones
- Coincidencia exacta
= - Coincidencia de prefijo preferencial
^~ - Coincidencia de expresión regular
~o~* - Coincidencia de prefijo (sin modificador)
Optimización de Rendimiento
Optimiza Nginx para máximo rendimiento:
Configuración de Procesos Trabajadores
# Establecer al número de núcleos de CPU
worker_processes auto;
# Vincular procesos trabajadores a núcleos de CPU
worker_cpu_affinity auto;
# Archivos abiertos máximos por trabajador
worker_rlimit_nofile 65535;
Manejo de Conexiones
events {
# Conexiones máximas por trabajador
worker_connections 4096;
# Usar método de conexión eficiente
use epoll; # Linux
# use kqueue; # FreeBSD/macOS
# Aceptar múltiples conexiones a la vez
multi_accept on;
}
Ajuste de Tamaño de Búfer
http {
# Tamaño de búfer del cuerpo del cliente
client_body_buffer_size 128k;
# Tamaño de búfer del encabezado del cliente
client_header_buffer_size 1k;
large_client_header_buffers 4 16k;
# Tiempo de espera del cuerpo del cliente
client_body_timeout 12;
client_header_timeout 12;
# Tiempo de espera de envío
send_timeout 10;
}
Optimización de Keepalive
http {
# Tiempo de espera de keepalive
keepalive_timeout 65;
# Solicitudes máximas por conexión
keepalive_requests 100;
}
Configuración de Compresión
http {
# Habilitar compresión gzip
gzip on;
# Nivel de compresión (1-9)
gzip_comp_level 6;
# Tamaño mínimo de archivo para comprimir
gzip_min_length 1000;
# Comprimir solicitudes proxy
gzip_proxied any;
# Tipos de archivo para comprimir
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml+rss
application/atom+xml
image/svg+xml;
# Agregar encabezado Vary
gzip_vary on;
# Deshabilitar para IE antiguo
gzip_disable "msie6";
}
Almacenamiento en Caché de Archivos
http {
# Caché de archivos abiertos
open_file_cache max=10000 inactive=30s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}
Caché FastCGI (para PHP)
http {
# Ruta de caché FastCGI
fastcgi_cache_path /var/cache/nginx/fastcgi
levels=1:2
keys_zone=FASTCGICACHE:100m
inactive=60m
max_size=1g;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
}
server {
location ~ \.php$ {
fastcgi_cache FASTCGICACHE;
fastcgi_cache_valid 200 60m;
add_header X-FastCGI-Cache $upstream_cache_status;
}
}
Endurecimiento de Seguridad
Implementa las mejores prácticas de seguridad:
Ocultar Versión de Nginx
http {
# Ocultar número de versión
server_tokens off;
}
Encabezados de Seguridad
server {
# Prevenir clickjacking
add_header X-Frame-Options "SAMEORIGIN" always;
# Prevenir detección de tipo MIME
add_header X-Content-Type-Options "nosniff" always;
# Habilitar protección XSS
add_header X-XSS-Protection "1; mode=block" always;
# Política de referrer
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Política de Seguridad de Contenido
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';" always;
# HSTS (si usas HTTPS)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}
Limitar Métodos de Solicitud
server {
# Permitir solo GET, HEAD, POST
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
}
Limitación de Tasa
http {
# Definir zona de límite de tasa
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location / {
# Aplicar límite de tasa
limit_req zone=one burst=20 nodelay;
}
}
}
Limitación de Conexiones
http {
# Limitar conexiones por IP
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location /download/ {
limit_conn addr 5;
}
}
}
Restringir Acceso por IP
location /admin {
allow 192.168.1.100;
allow 10.0.0.0/24;
deny all;
}
Denegar Acceso a Archivos Ocultos
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
Autenticación Básica
# Instalar utilidad htpasswd
sudo apt install apache2-utils # Ubuntu/Debian
sudo yum install httpd-tools # CentOS/Rocky/AlmaLinux
# Crear archivo de contraseña
sudo htpasswd -c /etc/nginx/.htpasswd username
Configurar Nginx:
location /admin {
auth_basic "Área Restringida";
auth_basic_user_file /etc/nginx/.htpasswd;
}
Deshabilitar Métodos HTTP Peligrosos
location / {
limit_except GET HEAD POST {
deny all;
}
}
Configuración SSL/TLS
Configura HTTPS para conexiones seguras:
Generar Certificado Auto-firmado (Solo para Pruebas)
sudo mkdir -p /etc/nginx/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/nginx-selfsigned.key \
-out /etc/nginx/ssl/nginx-selfsigned.crt
Bloque de Servidor HTTPS
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
# Certificados SSL
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# Protocolos y cifrados SSL
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# Caché de sesión SSL
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/ssl/chain.crt;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Root e index
root /var/www/example.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
# Redirigir HTTP a HTTPS
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
Gestión de Registros
Configura el registro efectivo:
Formato de Registro Personalizado
http {
log_format custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';
access_log /var/log/nginx/access.log custom;
}
Registro Condicional
map $status $loggable {
~^[23] 0;
default 1;
}
server {
access_log /var/log/nginx/access.log combined if=$loggable;
}
Deshabilitar Registro para Ubicaciones Específicas
location = /favicon.ico {
access_log off;
log_not_found off;
}
location = /robots.txt {
access_log off;
log_not_found off;
}
Ver Registros en Tiempo Real
# Registros de acceso
sudo tail -f /var/log/nginx/access.log
# Registros de errores
sudo tail -f /var/log/nginx/error.log
# Ambos registros
sudo tail -f /var/log/nginx/*.log
Verificación y Pruebas
Verifica tu configuración de Nginx:
Probar Sintaxis de Configuración
sudo nginx -t
Salida esperada:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Recargar Configuración
sudo systemctl reload nginx
# o
sudo nginx -s reload
Reiniciar Nginx
sudo systemctl restart nginx
Verificar Estado de Nginx
sudo systemctl status nginx
Ver Conexiones Activas
# Requiere módulo stub_status
curl http://localhost/nginx_status
Configurar stub_status:
server {
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
}
Solución de Problemas Comunes
Nginx No Inicia
Verifica registros de errores:
sudo journalctl -u nginx -n 50 --no-pager
sudo tail -f /var/log/nginx/error.log
Causas comunes:
- Errores de sintaxis en la configuración
- Puerto ya en uso
- Problemas de permisos
- Directorios faltantes
Errores de Sintaxis de Configuración
Siempre prueba antes de recargar:
sudo nginx -t
Revisa el mensaje de error específico y el número de línea.
Puerto Ya en Uso
Encuentra qué está usando el puerto 80:
sudo ss -tulpn | grep :80
sudo lsof -i :80
Errores de Permiso Denegado
Verifica la propiedad de archivos:
ls -la /var/www/example.com/
Corrige permisos:
sudo chown -R www-data:www-data /var/www/example.com # Ubuntu/Debian
sudo chown -R nginx:nginx /usr/share/nginx/example.com # CentOS/Rocky
En sistemas SELinux:
# Verificar estado de SELinux
getenforce
# Establecer contexto correcto
sudo chcon -R -t httpd_sys_content_t /usr/share/nginx/example.com/
# Establecer permanentemente
sudo semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/example.com(/.*)?"
sudo restorecon -Rv /usr/share/nginx/example.com/
502 Bad Gateway
Causas comunes:
- PHP-FPM no está en ejecución
- Ruta de socket incorrecta
- Recursos insuficientes
Verificar PHP-FPM:
sudo systemctl status php8.1-fpm # Ubuntu/Debian
sudo systemctl status php-fpm # CentOS/Rocky
413 Request Entity Too Large
Aumentar límite de tamaño de carga:
http {
client_max_body_size 20M;
}
Rendimiento Lento
Verificar procesos trabajadores:
ps aux | grep nginx
Optimizar worker_processes y worker_connections:
worker_processes auto;
events {
worker_connections 4096;
}
Mejores Prácticas
Sigue estas mejores prácticas de Nginx:
Actualizaciones Regulares
Mantén Nginx actualizado:
# Ubuntu/Debian
sudo apt update
sudo apt upgrade nginx
# CentOS/Rocky/AlmaLinux
sudo dnf update nginx
Respaldos de Configuración
Respalda antes de hacer cambios:
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup-$(date +%F)
sudo tar -czf nginx-config-backup-$(date +%F).tar.gz /etc/nginx/
Usar Directivas Include
Organiza configuraciones:
http {
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Archivos de Registro Separados por Sitio
server {
access_log /var/log/nginx/example.com-access.log;
error_log /var/log/nginx/example.com-error.log;
}
Monitorear Recursos
# Verificar uso de memoria
free -h
# Verificar uso de CPU
top
# Verificar espacio en disco
df -h
# Procesos de Nginx
ps aux | grep nginx
Usar Fragmentos de Configuración
Crea fragmentos reutilizables:
sudo nano /etc/nginx/snippets/ssl-params.conf
Agrega:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
Incluir en bloques de servidor:
server {
listen 443 ssl http2;
include snippets/ssl-params.conf;
# ...
}
Conclusión
Nginx es un servidor web potente, eficiente y flexible que sobresale en entornos modernos de alojamiento web. Esta guía completa ha cubierto instalación, configuración, optimización y endurecimiento de seguridad en múltiples distribuciones de Linux.
Puntos clave:
- La arquitectura basada en eventos de Nginx proporciona rendimiento superior para conexiones concurrentes
- La configuración adecuada de bloques de servidor permite alojamiento multi-sitio eficiente
- El ajuste de rendimiento a través de procesos trabajadores y buffering impacta significativamente la eficiencia
- El endurecimiento de seguridad con encabezados, limitación de tasa y SSL/TLS es esencial para producción
- El monitoreo regular, actualizaciones y respaldos mantienen la salud del servidor
La versatilidad de Nginx se extiende más allá del servicio web básico a proxy inverso, balanceo de carga, caché y funcionalidad de gateway API. Continúa explorando características avanzadas como soporte HTTP/2, QUIC/HTTP/3, estrategias de caché avanzadas e integración con stacks de aplicaciones modernas.
Para despliegues en producción, siempre implementa HTTPS, configura registro y monitoreo adecuados, establece respaldos automatizados y sigue las mejores prácticas de seguridad. La comunidad de Nginx y la documentación proporcionan excelentes recursos para configuraciones avanzadas y solución de problemas.


