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