🚏 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
).