Microcaching și Accelerarea Răspunsurilor HTTP cu proxy_cache în Nginx în Nginx

Ghid complet pentru directiva proxy_cache în Nginx: configurarea stocării în memorie și pe disc, microcaching de câteva secunde pentru atenuarea vârfurilor de trafic, antetul X-Cache-Status și invalidarea cache-ului.

Sintaxă
proxy_cache_path /var/cache/nginx keys_zone=my_cache:10m levels=1:2 inactive=60m; proxy_cache my_cache;

Atunci când Nginx acționează ca Reverse Proxy în fața unor aplicații Node.js, Python/Django sau PHP-FPM, redirecționarea fiecărei cereri identice către backend poate bloca rapid baza de date și serverul de aplicație la vârfuri de trafic. Mecanismul proxy_cache permite salvarea răspunsurilor generate de backend pe discul serverului Nginx și servirea lor instantanee către ceilalți vizitatori, reducând timpul de răspuns de la 300 ms la sub 2 milisecunde.

Configurația completă de caching în /etc/nginx/sites-available/default
# În contextul http (definirea zonei de stocare pe disc și a indexului în RAM):
proxy_cache_path /var/cache/nginx/api_cache
    levels=1:2
    keys_zone=API_CACHE:10m       # 10 MB de RAM memorează ~80.000 de chei de cache
    max_size=1g                   # Limita maximă de spațiu pe disc
    inactive=60m                  # Șterge fișierele neaccesate timp de 1 oră
    use_temp_path=off;

server {
    listen 80;
    server_name api.dexblog.ro;

    location / {
        proxy_pass http://localhost:3000;

        # 1. Activăm zona de cache:
        proxy_cache API_CACHE;

        # 2. Definim cheia unică de cache (Metodă + Host + URI + Argumente):
        proxy_cache_key "$request_method$scheme$host$request_uri";

        # 3. Microcaching: Păstrăm răspunsurile HTTP 200/301 timp de doar 10 secunde!
        # Acest mic interval atenuează 95% din încărcarea bazei de date la știri virale:
        proxy_cache_valid 200 301 10s;
        proxy_cache_valid 404 1m;

        # 4. Antet util de depanare în browser (HIT, MISS, BYPASS, EXPIRED):
        add_header X-Cache-Status $upstream_cache_status;

        # 5. Reziliență la căderi de backend (servește cache-ul vechi dacă backend-ul dă eroare!):
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_lock on; # Permite unei singure cereri să interogheze backend-ul la expirare
    }
}

Interpretarea Antetului X-Cache-Status

  • HIT: Răspunsul a fost servit instant din cache-ul Nginx (fără a atinge deloc aplicația backend).
  • MISS: Răspunsul nu a fost găsit în cache, a fost interogat backend-ul și salvat pentru viitor.
  • BYPASS: Cache-ul a fost ocolit deliberat (de exemplu pentru utilizatori autentificați cu cookie-uri de sesiune).
  • STALE: Backend-ul a dat eroare 502, dar Nginx a salvat situația servind copia anterioară din cache.