10 Configuraciones Esenciales para Acelerar Nginx y Optimizar el Rendimiento de tu Servidor

Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero

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 encabezado Vary: 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.