Django in productie: Gunicorn gelanceerd met zeventien werknemers “via internetformule”, Nginx die alles – inclusief /statisch/ – proxy voor Gunicorn. De Gunicorn CPU gaat tot 100% tijdens een beeldcrawl. Oplossing: nginx alias /static/ en werkers teruggebracht tot vijf: API-latentie wordt gedeeld door drie.
De standaard Django-stack in productie ziet er als volgt uit:
Klant → Nginx (TLS, compressie, statische bestanden, snelheidsbeperking) → Gunicorn (WSGI) → Django
Gunicorn is geen openbare webserver — het is een WSGI-procesmanager. Nginx voert geen Python uit — het zou Django nooit moeten interpreteren.
Maatvoering van Gunicorn met meting, niet met alleen de formule
Startformule op een VPS met twee kernen: workers = (2 × cores) + 1 → vijf werknemers.
Verfijn vervolgens volgens:
- RAM: sta 100 tot 300 MB per Django-werknemer toe, afhankelijk van de toepassing.
--time-out 30: dood een geblokkeerde werker - een lang rapport moet via Celery gaan, niet via HTTP.--graceful-timeout: uitgelijnd metproxy_read_timeoutnginx.--max-requests 1000 --max-requests-jitter 50: recycle werknemers om lichte geheugenlekken te beperken.
gunicorn mijnproject.wsgi:application\
--bind unix:/run/gunicorn.sock \
--werknemers 5 \
--time-out 30 \
--toegang-logbestand -
Typische nginx-configuratie
locatie /statisch/ {
alias /var/www/mijnproject/static/;
vervalt 30d;
}
locatie /media/ {
alias /var/www/mijnproject/media/;
}
locatie / {
proxy_pass http://unix:/run/gunicorn.sock;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $schema;
}
Configureer ALLOWED_HOSTS en SECURE_PROXY_SSL_HEADER in Django zodat HTTPS achter nginx correct wordt herkend.
systemd, socket en naadloze implementatie
Een gunicorn.service-eenheid met User=www-data en Restart=always zorgt voor automatisch opnieuw opstarten. De Unix-socketmachtigingen moeten nginx toegang geven.
Bij implementatie: collectstatic, herlaad dan Gunicorn (gracieuze HUP). Werknemers voltooien huidige verzoeken voordat nieuwe code wordt geladen – geen abrupte beëindiging als time-outs op één lijn liggen.
Asynchrone werknemers: voorzichtigheid
gevent kan helpen als uit profilering blijkt dat er sprake is van aanzienlijke netwerkwachttijden (externe API-aanroepen). Dit is niet de standaardkeuze voor e-commerce met veel databases; synchronisatie met een grote Postgres-verbindingspool blijft voorspelbaarder.
Voor langlopende taken, zie Celery en wachtrijen.
Hosting- en productbeperkingen
Een VPS is het minimum voor een serieuze Django in productie. PaaS (Railway, Clever Cloud) abstracte Gunicorn - u configureert een Procfile of gelijkwaardig. Gedeelde Python blijft zeldzaam en maakt over het algemeen geen controle over het aantal werkers mogelijk.
De top: Overbelaste Gunicorn serveert vaak wat Nginx gratis zou geven
Controleer uw nginx-logboeken: als meer dan nul procent van de statische of mediaverzoeken naar de Gunicorn upstream gaat, corrigeer dan de aliassen voordat u werkrollen toevoegt.
Beslis en ga vooruit zonder blinde vlek
Om een Django-stack weer op een gezonde basis te brengen:
- Configureer nginx om
/static/en/media/als aliassen te dienen - Gunicorn zou alleen dynamisch moeten omgaan. - Grootte werknemers gebaseerd op het aantal cores en gemeten RAM, niet op een gekopieerde en geplakte formule.
- Lijn time-outs uit tussen nginx en Gunicorn om onderbrekingen tijdens de verwerking te voorkomen.
- Uitbesteden exports en rapportages langer dan dertig seconden naar Celery of een wachtrij.
- Script voor een soepele herlaadbeurt bij implementatie — collectstatic, HUP, HTTP-rooktest.
Voor het poolen van Postgres-verbindingen, zie Verbindingspooling. Om VPS-hosts te vergelijken, bladert u door onze overzicht.
Veelgestelde vragen
Hoeveel Gunicorn-arbeiders?
Begin met (2 × cores) + 1, en pas vervolgens aan op basis van RAM en metingen onder echte belasting.
Levert Nginx statische Django-bestanden?
Ja - collectstatic naar een mapalias nginx. Gunicorn mag geen CSS, JS of media bedienen.
Socket Unix of TCP?
Unix-socket op dezelfde machine; TCP localhost voor gecontaineriseerde architecturen.
synchroniseren versus gevent?
standaardsynchronisatie; alleen geven als profilering een dominante netwerkverwachting blijkt.
Gunicorn bestuurt Django; Nginx doet de rest: de twee verwarren is het betalen van Python om PNG's te serveren.
