đ Routing, nginx et cache¶
Le projet est actuellement dĂ©ployĂ© sur Scalingo, Scalingo qui impose une limite de 50 requĂȘtes/seconde sur un worker. Nous avons dĂ©cidĂ© dâajouter Nginx en janvier 2025 afin dâagir comme serveur de cache et anticiper sur lâatteinte de cette limite.
nginx¶
Dans lâhypothĂšse dâun pic de charge,
Le cache de certaines vues Django (dĂ©chet / produit, page dâaccueil de lâassistantâŠ)
Le cache des fichiers statiques (CSS, JSâŠ)
Des images valant mille mots, ci-dessous un schĂ©ma rĂ©sumant le parcours dâune requĂȘte lorsquâelle atteint lvao.ademe.fr ou quefairedemesdechets.ademe.fr
sequenceDiagram
participant Client
participant Nginx
participant Django
Client->>Nginx: Request lvao.ademe.fr
alt Cache Hit
Nginx-->>Client: Return cached response
else Cache Miss
Nginx->>Django: Forward request to Django
Django-->>Nginx: Generate response
alt Authenticated User
Django->>Nginx: Add 'logged_in' cookie
end
alt iframe query param present
Django->>Nginx: Add iframe cookie
end
Nginx-->>Client: Return Django response
end
Les cookies dĂ©finis expirent Ă la fin de la session, cela veut dire quâils seront re-gĂ©nĂ©rĂ©s si lâutilisateur ferme son navigateur.
Whitenoise¶
Les fichiers statiques sont servis via Whitenoise, cela afin de gĂ©rer finement le cache de ceux-ci. La documentation officielle rĂ©pond aux principales questions que lâon peut se poser Ă ce sujet :
Pourquoi pas charger les statiques depuis un S3 ?
Comment servir les fichiers statiques derriĂšre une reverse proxy ?
Dans notre cas, Whitenoise fonctionne de la maniĂšre suivante :
Ă chaque dĂ©ploiement, les fichiers statiques sont suffixĂ©s dâun hash de leur contenu
La durĂ©e de mise en cache est infinie pour ces fichiers. Cela peut ĂȘtre fait sans risque car sâils sont modifiĂ©s, le hash changera
Middlewares¶
Le fonctionnement décrit ci-dessous concernant Nginx est défini dans un middleware Django (qfdmd/middleware.py).