El número de peticiones por segundo que Apache + Gunicorn puede manejar depende de varios factores:
- Configuración de Gunicorn (número de workers y tipo de worker).
- Modo de Apache (prefork, worker o event).
- Especificaciones del servidor (CPU, RAM).
- Carga de la aplicación (uso de base de datos, procesamiento de datos, etc.).
Configuración de Gunicorn (número de workers y tipo de worker
).
Modos de Apache (prefork, worker o event).
Apache en su configuración por defecto usa el modo prefork
, que no es eficiente para muchas conexiones simultáneas.
En este modo, cada petición se maneja con un proceso separado, lo que consume más RAM y limita la cantidad de conexiones concurrentes.
Para mejorar el rendimiento, puedes cambiar al modo worker o event
, que usa hilos en lugar de procesos.
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo systemctl restart apache2
🔹 Configuración básica (Prefork, 4 workers en Gunicorn) Apache: Modo prefork, 10 procesos. Gunicorn: 4 workers tipo sync (gunicorn -w 4 myapp:app).
📌 Rendimiento estimado (en un servidor de 2 vCPUs y 4GB RAM):
~100-300 RPS (requests per second)
con respuestas ligeras (~100ms).
Puede colapsar rápidamente con muchas conexiones simultáneas.
🔹 Configuración optimizada (Event MPM, Gunicorn async/gevent) Apache: Modo event, MaxClients 256. Gunicorn: 4 workers gevent (gunicorn -w 4 -k gevent myapp:app).
📌 Rendimiento estimado:
~500-1000 RPS (requests per second)
en un servidor de 2 vCPUs y 4GB RAM.
Mejor manejo de concurrencia, pero aún limitado comparado con Nginx.
Si aumentas los workers en Gunicorn (workers = núcleos * 2 + 1), puedes mejorar el rendimiento.
ab -n 1000 -c 100 http://127.0.0.1:8000/
🔹 -n 1000 → Enviar 1000 peticiones.
🔹 -c 100 → Enviar 100 peticiones simultáneas.
wrk -t4 -c100 -d30s http://127.0.0.1
🔹 -t4 → 4 hilos de prueba.
🔹 -c100 → 100 conexiones simultáneas.
🔹 -d30s → Ejecutar la prueba durante 30 segundos.
Esto te dirá cuántas RPS soporta tu configuración. 🚀
El rendimiento de Nginx + Gunicorn en términos de requests per second (RPS) depende de varios factores clave:
- Configuración de Gunicorn (número de workers y tipo de worker).
- Configuración de Nginx (buffers, keepalive, conexiones concurrentes).
- Especificaciones del servidor (CPU, RAM, tipo de almacenamiento).
- Carga de la aplicación (si solo sirve contenido estático o si ejecuta lógica pesada).
🔹 Configuración optimizada Gunicorn async/gevent, (gunicorn -w 4 -k gevent myapp:app)
Nginx optimizado (worker_connections 4096) en /etc/nginx/nginx.conf
:
worker_processes auto;
events {
worker_connections 4096;
multi_accept on;
}
📌 Rendimiento estimado (en un servidor de 2 vCPUs y 4GB RAM):
1000-5000 RPS (requests per second)
en un servidor con 2 vCPUs y 4GB RAM.
Aumentar el límite de archivos abiertos en el sistema.
Configurar el balanceo de carga (opcional)
upstream backend {
least_conn; # Balanceo de carga basado en el menor número de conexiones
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
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;
}
}