
Estoy alojando una aplicación Django que sirve como punto final API. Lamentablemente, la aplicación que utiliza la API realiza muchas solicitudes simultáneas al cargar la página (en el ámbito de 80 a 90 solicitudes).
Nginx se ejecuta como proxy inverso frente a gunicorn e informa el siguiente problema:
kevent() reported that connect() failed (54: Connection reset by peer) while connecting to upstream
Eso me llevó a escalar gunicorn. Lo intenté -k gevent
y aumenté --worker-connections
, pero no ayudó mucho. Tuve aproximadamente el mismo éxito con --threads
los trabajadores de sincronización.
Noté algunas apariciones de Listen queue overflow: 16 already in queue awaiting acceptance (55 occurrences)
in dmesg
, lo que me llevó a aumentar kern.ipc.somaxconn
hasta 4096, pero nuevamente: sin éxito.
Según la documentación de gunicorn, suelo hey
ver si el proxy está haciendo lo correcto y probar la carga del Endpoint:
hey -c 100 -n 200 -H "Authorization: token ${token}" 'https://example.com/api/'
Lo que devuelve algo parecido (a veces un poco mejor, a veces un poco peor):
Status code distribution:
[200] 126 responses
[502] 74 responses
Configuración de nginx relevante:
worker_processes auto;
events {
worker_connections 1024;
accept_mutex on;
use kqueue;
}
upstream backend-api {
server 127.0.0.1:8000 fail_timeout=0;
}
server {
listen 443 ssl http2 accept_filter=httpready;
server_name example.com;
ssl_certificate /usr/local/etc/nginx/sites/example.com.crt;
ssl_certificate_key /usr/local/etc/nginx/sites/example.com.key;
location = /favicon.ico { access_log off; log_not_found off; }
root /usr/local/www/example.com/web;
index index.html ;
keepalive_timeout 5;
location ~ ^/(static|assets|index.html|$) {
root /usr/local/www/example.com/web;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Real-IP $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_intercept_errors on;
proxy_pass http://backend-api;
}
}
Ejecutando gunicorn con:
gunicorn --workers=9 --bind 0.0.0.0:8000 --forwarded-allow-ips='*' -k gevent --worker-connections=1000 api.wsgi'
Parece que no puedo encontrar una solución a esto. No importa lo que intente, sólo puedo obtener "menos" 502 al cargar una página, pero nunca ninguno de manera confiable. ¿Qué me estoy perdiendo?
Gunicorn no informa ningún problema: las solicitudes nunca parecen llegar tan lejos.