
Ich hoste eine Django-App, die als API-Endpunkt dient. Leider führt die App, die die API verwendet, beim Laden der Seite viele gleichzeitige Anfragen aus (im Bereich von 80-90 Anfragen).
Nginx läuft als Reverse-Proxy vor Gunicorn und meldet folgendes Problem:
kevent() reported that connect() failed (54: Connection reset by peer) while connecting to upstream
Das hat mich dazu gebracht, Gunicorn zu skalieren. Ich habe versucht -k gevent
, zu erhöhen --worker-connections
, aber es hat nicht viel geholfen. Ich hatte ungefähr den gleichen Erfolg mit --threads
und Sync-Workern.
Mir sind einige Vorkommen von Listen queue overflow: 16 already in queue awaiting acceptance (55 occurrences)
in aufgefallen dmesg
, die mich dazu veranlasst haben, den Wert kern.ipc.somaxconn
auf bis zu 4096 zu erhöhen, aber auch hier: ohne Erfolg.
Gemäß der Gunicorn-Dokumentation verwende ich hey
Folgendes, um zu prüfen, ob der Proxy das Richtige tut, und um einen Belastungstest des Endpunkts durchzuführen:
hey -c 100 -n 200 -H "Authorization: token ${token}" 'https://example.com/api/'
Das Ergebnis ist ungefähr so (manchmal etwas besser, manchmal etwas schlechter):
Status code distribution:
[200] 126 responses
[502] 74 responses
Relevante nginx-Konfiguration:
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;
}
}
Gunicorn ausführen mit:
gunicorn --workers=9 --bind 0.0.0.0:8000 --forwarded-allow-ips='*' -k gevent --worker-connections=1000 api.wsgi'
Ich kann dafür keine Lösung finden. Egal, was ich versuche, ich bekomme beim Laden der Seite immer „weniger“ 502er, aber nie zuverlässig gar keine. Was übersehe ich?
Gunicorn meldet keine Probleme – die Anfragen scheinen nie so weit zu gelangen.