proxy_cache Nginx untuk Dynamic Website

proxy_cache Nginx untuk Dynamic Website

Banyak orang mengira caching hanya cocok untuk website statis atau CDN. Padahal, Nginx bisa melakukan caching agresif untuk website dinamis—bahkan sering kali lebih efektif dari CDN jika user dan server berada di region yang sama.

Masalahnya:

  • Salah konfigurasi → data basi
  • Salah cache key → user dapat data orang lain
  • Terlalu agresif → bug yang sulit dilacak

Artikel ini membahas cara kerja proxy_cache, pola aman, dan kesalahan fatal yang sering terjadi.


1. Apa Itu proxy_cache?

proxy_cache adalah mekanisme:

  • Menyimpan response upstream (HTTP)
  • Di disk (dan RAM metadata)
  • Dilayani ulang tanpa memanggil backend

Artinya:

Backend bisa tidak dipanggil sama sekali untuk request yang sama.


2. Dynamic ≠ Tidak Bisa Di-cache

Salah kaprah besar:

“Website dinamis tidak bisa di-cache.”

Faktanya:

  • Banyak halaman dinamis deterministik
  • Banyak user melihat konten yang sama
  • Backend sering melakukan kerja yang sama berulang-ulang

Contoh yang bisa di-cache:

  • Homepage
  • Artikel
  • List produk
  • Search populer (short TTL)

3. Cara Kerja proxy_cache (Singkat tapi Penting)

  1. Request masuk ke Nginx
  2. Nginx cek cache key
  3. Cache hit → response langsung
  4. Cache miss → forward ke backend
  5. Response disimpan (jika memenuhi syarat)

Kunci:

  • Cache key
  • Cache policy
  • Cache bypass

4. Setup Dasar proxy_cache

Definisi Cache Zone

proxy_cache_path /var/cache/nginx
    levels=1:2
    keys_zone=dynamic_cache:100m
    max_size=10g
    inactive=60m
    use_temp_path=off;

Artinya:

  • Metadata cache di RAM: 100 MB
  • Data cache di disk: max 10 GB
  • Cache idle 60 menit dibuang

Penerapan di Server

server {
    location / {
        proxy_pass http://backend;
        proxy_cache dynamic_cache;
        proxy_cache_valid 200 10m;
    }
}

5. Cache Key: Sumber Masalah Terbesar

Default cache key:

$scheme$proxy_host$request_uri

Masalah:

  • Tidak peduli user login
  • Tidak peduli cookie
  • Tidak peduli device

Ini bisa sangat berbahaya.


6. Jangan Cache User Login (WAJIB)

Bypass Cache Jika Ada Cookie Auth

map $http_cookie $skip_cache {
    default 0;
    ~session 1;
}
location / {
    proxy_cache dynamic_cache;
    proxy_cache_bypass $skip_cache;
    proxy_no_cache $skip_cache;
}

Efek:

  • User login selalu bypass cache
  • User anonim tetap dapat cache

7. Cache Header Itu Raja

Idealnya:

  • Backend mengontrol cache
  • Nginx mengikuti

Contoh backend:

Cache-Control: public, max-age=300

Nginx:

proxy_ignore_headers Cache-Control Expires;
proxy_cache_valid 200 5m;

⚠️ Hati-hati mengabaikan header backend.


8. Microcaching: Senjata Rahasia

TTL sangat pendek:

proxy_cache_valid 200 1s;

Efek:

  • Request bersamaan disatukan
  • Backend tidak diserbu
  • Data tetap “fresh”

Ini sangat efektif untuk:

  • Homepage
  • API berat
  • Traffic spike

9. proxy_cache_lock: Anti Cache Stampede

Tanpa lock:

  • 100 request cache miss
  • 100 request ke backend

Dengan lock:

proxy_cache_lock on;
proxy_cache_lock_timeout 5s;

Efek:

  • 1 request ke backend
  • 99 nunggu cache terisi

10. Cache dan Query String

Secara default:

  • Query string masuk cache key

Kadang perlu dikontrol:

proxy_cache_key "$scheme$host$uri";

⚠️ Bahaya jika konten berbeda tergantung query.


11. Debug Cache (WAJIB)

Tambahkan header:

add_header X-Cache $upstream_cache_status;

Hasil:

  • HIT
  • MISS
  • BYPASS
  • EXPIRED

Tanpa ini, debugging = neraka.


12. Hal yang TIDAK Boleh Di-cache

  • Login page
  • Dashboard user
  • Cart
  • Checkout
  • Data sensitif

Rule umum:

Jika beda user → jangan cache


13. Kesalahan Fatal yang Sering Terjadi

  1. Cache semua tanpa bypass
  2. TTL terlalu lama
  3. Cache key terlalu sederhana
  4. Tidak lock cache
  5. Tidak monitoring disk

14. Real Use Case yang Masuk Akal

  • CMS dengan traffic tinggi
  • Blog / media online
  • Product catalog
  • API read-heavy
  • Landing page campaign

15. Kesimpulan

proxy_cache:

  • Bukan mainan
  • Bukan hanya untuk statis
  • Sangat powerful jika dipakai benar

Kalimat paling penting:

Cache yang baik mengurangi load, cache yang salah merusak data.