map Directive — Fitur Nginx PALING UNDERRATED

map Directive — Fitur Nginx PALING UNDERRATED

Jika ada satu directive Nginx yang:

  • Jarang dibahas
  • Jarang dipahami
  • Tapi sering jadi solusi paling bersih

Maka jawabannya adalah: map.

Ironisnya, banyak konfigurasi Nginx menjadi:

  • Penuh if
  • Sulit dibaca
  • Sulit di-debug
    padahal semua itu bisa disederhanakan dengan map.

1. Apa Itu map?

map adalah directive untuk:

Memetakan satu variable menjadi variable lain berdasarkan kondisi

Ia dievaluasi:

  • Sekali per request
  • Sangat cepat
  • Tanpa branching kompleks

Sintaks dasar:

map $variable_asal $variable_baru {
    kondisi nilai;
    default nilai_default;
}

2. Kenapa map Lebih Baik dari if?

Fakta pahit:

  • if di Nginx bukan if biasa
  • Bisa menyebabkan perilaku tak terduga
  • Sulit di-maintain
  • Sulit di-debug

Dokumentasi resmi bahkan terkenal dengan kalimat:

“if is evil”

map:

  • Aman
  • Deterministik
  • Dievaluasi lebih awal
  • Cocok untuk logic routing

3. Contoh Paling Umum (Tapi Jarang Dipakai)

❌ Tanpa map

location / {
    if ($http_user_agent ~* mobile) {
        set $is_mobile 1;
    }
}

✅ Dengan map

map $http_user_agent $is_mobile {
    ~*mobile 1;
    default 0;
}

Lebih:

  • Bersih
  • Konsisten
  • Mudah diperluas

4. map Dievaluasi di Fase Awal (Penting!)

map:

  • Dievaluasi sebelum location
  • Bisa dipakai di:
    • proxy_pass
    • fastcgi_pass
    • proxy_cache_bypass
    • limit_req
    • log_format

Inilah kekuatannya.


5. Use Case #1: Cache Bypass yang WARAS

Tanpa map (Chaos)

if ($http_cookie ~ session) {
    set $skip_cache 1;
}

Dengan map (Elegan)

map $http_cookie $skip_cache {
    default 0;
    ~session 1;
}
proxy_cache_bypass $skip_cache;
proxy_no_cache $skip_cache;

Ini pola production-grade.


6. Use Case #2: Rate Limiting Pintar

Rate limit user login, tapi longgar untuk internal IP:

map $remote_addr $login_rate {
    10.0.0.0/8 unlimited;
    default 5r/m;
}

Dipakai di:

limit_req_zone $binary_remote_addr zone=login:10m rate=$login_rate;

Tanpa map, ini hampir mustahil dibaca.


7. Use Case #3: A/B Testing TANPA Tool Tambahan

map $remote_addr $variant {
    ~^[0-7] A;
    default B;
}
add_header X-Variant $variant;

Digunakan untuk:

  • Feature flag sederhana
  • Gradual rollout
  • Canary release

Tanpa backend berubah.


8. Use Case #4: Multi-Upstream Routing

map $http_x_region $backend {
    id  backend_id;
    sg  backend_sg;
    default backend_default;
}
proxy_pass http://$backend;

Ini sangat powerful:

  • Tidak perlu if
  • Tidak perlu rewrite
  • Tidak perlu reload logic

9. Regex di map: Fleksibel Tapi Aman

map $request_uri $is_api {
    ~^/api/ 1;
    default 0;
}

Dipakai untuk:

  • Cache rule
  • Rate limit
  • Header injection

Regex di map jauh lebih aman dibanding di if.


10. map Bisa Dipakai di log_format

Ini underrated level dewa.

map $status $loggable {
    499 0;
    default 1;
}
access_log /var/log/nginx/access.log combined if=$loggable;

Efek:

  • 499 tidak mengotori log
  • Disk lebih awet
  • Analisis lebih bersih

11. Performa map: Jangan Takut

map:

  • Dievaluasi sekali
  • Disimpan di memory
  • Hampir tidak terasa overhead-nya

Dibanding:

  • Regex berulang di if
  • Rewrite berkali-kali

map lebih cepat dan stabil.


12. Kesalahan Umum Saat Pakai map

  1. Menaruh map di dalam server {}
    map harus di http {}
  2. Tidak pakai default
    → Bisa menghasilkan variable kosong
  3. Terlalu banyak regex berat ❌
    → Tetap perlu kontrol

13. Pola Mental yang Benar

Gunakan map untuk:

  • Keputusan
  • Flag
  • Routing
  • Policy

Gunakan location untuk:

  • Path matching
  • File handling

Jika logic Anda mulai “bercabang”, itu tanda map dibutuhkan.


14. Kenapa map Jarang Dipakai?

Karena:

  • Tidak “kelihatan”
  • Tidak error kalau tidak ada
  • Jarang di tutorial pemula
  • Tidak viral seperti proxy_pass

Padahal:

Banyak konfigurasi Nginx level senior tidak mungkin rapi tanpa map.


15. Kesimpulan

Jika Anda ingin naik level di Nginx:

Berhenti pakai if, mulai pakai map.

map adalah:

  • Cleaner
  • Safer
  • Lebih scalable
  • Lebih mudah di-maintain

Dan mungkin:

Fitur Nginx paling underrated di dunia nyata.