Nginx tiene varias directivas y configuraciones que pueden ayudarte a acelerar el tráfico y optimizar el rendimiento del servidor. Aquí hay algunas configuraciones clave:
1. Uso de sendfile
, tcp_nopush
y tcp_nodelay
Estas ya las mencionamos, pero forman parte esencial de la optimización del tráfico:
sendfile on;
tcp_nopush on;
tcp_nodelay on;
tcp_nodelay
: Se asegura de que los paquetes pequeños (como respuestas rápidas) no se retrasen en el envío.
2. Configuración de worker_processes
y worker_connections
Asegúrate de optimizar el número de procesos y conexiones que Nginx puede manejar:
worker_processes auto; # Usa todos los núcleos de CPU disponibles
worker_connections 1024; # Número máximo de conexiones por worker
worker_processes auto
: Permite que Nginx use automáticamente todos los núcleos del procesador.worker_connections
: Define cuántas conexiones simultáneas puede manejar cada proceso.
3. Uso de Compresión (gzip)
Habilitar gzip
comprime las respuestas antes de enviarlas al cliente, reduciendo el tráfico:
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1024;
gzip_comp_level 6;
gzip_vary on;
gzip_comp_level
: Controla el nivel de compresión (1-9, con 6 siendo un buen equilibrio entre compresión y rendimiento).gzip_min_length
: Solo comprime respuestas mayores a este tamaño.gzip_vary
: Añade un encabezadoVary: Accept-Encoding
para que los proxies cacheen correctamente.
4. Cache de Archivos Estáticos
Sirve contenido estático desde el cache para evitar generar una nueva respuesta cada vez:
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg|eot|otf)$ {
expires max;
log_not_found off;
access_log off;
}
expires max
: Indica que los archivos tienen un tiempo de vida prolongado en el cache del cliente.log_not_found off
: Evita que archivos faltantes generen registros, reduciendo la carga del disco.access_log off
: Desactiva el registro para estos archivos, mejorando el rendimiento.
5. Ajustes del Buffer
Evita fragmentar las respuestas al cliente ajustando los buffers:
client_body_buffer_size 10K;
client_max_body_size 8M;
client_header_buffer_size 1k;
large_client_header_buffers 4 8k;
client_max_body_size
: Limita el tamaño de los cuerpos de las solicitudes (útil para evitar abusos).large_client_header_buffers
: Define el tamaño y número de buffers para manejar encabezados grandes.
6. HTTP/2
HTTP/2 acelera las conexiones al permitir multiplexing (múltiples solicitudes/respuestas por conexión):
listen 443 ssl http2;
- Asegúrate de que tu servidor esté configurado con SSL/TLS, ya que HTTP/2 requiere HTTPS.
7. Cache en Disco (FastCGI Cache o Proxy Cache)
Si usas Nginx como servidor de aplicaciones o proxy inverso, habilita el caché:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
proxy_cache_key "$scheme$request_method$host$request_uri";
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://backend;
}
proxy_cache_path
: Define el directorio y tamaño del caché.proxy_cache_valid
: Especifica cuánto tiempo guardar las respuestas en el caché.add_header X-Cache-Status
: Ayuda a monitorizar si las respuestas son servidas desde el caché.
8. Reducción de Conexiones Lentas (Timeouts)
Configura los tiempos de espera para evitar que las conexiones lentas consuman recursos innecesarios:
keepalive_timeout 15;
client_body_timeout 10;
client_header_timeout 10;
send_timeout 10;
keepalive_timeout
: Controla cuánto tiempo Nginx mantiene una conexión abierta.send_timeout
: Define cuánto tiempo esperar antes de cerrar conexiones inactivas.
9. Brotli (opcional)
Si tienes ngx_brotli
instalado, puedes usar Brotli para una compresión más eficiente que gzip:
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml+rss text/javascript;
10. Limitar Solicitudes (Rate Limiting)
Controla la cantidad de solicitudes que un cliente puede realizar en un periodo para evitar abusos:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
location / {
limit_req zone=mylimit burst=20 nodelay;
}
rate=10r/s
: Permite 10 solicitudes por segundo.burst=20
: Permite un "burst" o ráfaga de hasta 20 solicitudes antes de aplicar restricciones.
11. Monitorización del Estado
Usa el módulo stub_status
para monitorizar el rendimiento de Nginx:
location /nginx_status {
stub_status;
allow 127.0.0.1; # Permite el acceso solo desde localhost
deny all;
}
Esto te dará métricas como conexiones activas, solicitudes por segundo, etc.