NGINX Reverse Proxy & Load Balancing
Target: Pemula yang telah memahami NGINX Dasar dan ingin menguasai Reverse Proxy (
proxy_pass), Preserving Client Headers (Host,X-Real-IP,X-Forwarded-*), WebSocket Real-Time Proxying, FastCGI PHP-FPM, Upstream Load Balancing (round-robin,least_conn,ip_hash,weight,backup,down), Passive Health Checks & Failover (proxy_next_upstream), Proxy Timeouts & Buffering, serta High-Performance Proxy Caching (proxy_cache_path,proxy_cache_valid,$upstream_cache_status) menggunakan NGINX 1.24+ / 1.26+. Versi: NGINX 1.24+ / 1.26+ Prasyarat: NGINX Dasar Fokus modul pembelajaran ini: mental model Reverse Proxy vs Forward Proxy →proxy_pass& Trailing Slash gotcha → Client Identity Headers → WebSocket & Socket.io Upgrade → FastCGI PHP-FPM → Upstream Cluster & Load Balancing Algorithms → Weight & Server Parameters → Failover & Timeouts (504 Prevention) → Buffering → Proxy Caching Path & Memory Zones → Cache Bypass & Revalidation → Cache HIT/MISS Tracking → HTTP/1.1 Upstream Keepalive → mini project High-Availability Microservices API Gateway.
Cara Belajar
🟢 Fundamental
→ wajib dipahami: Reverse Proxy mental model, proxy_pass, Trailing Slash, Proxy Headers wajib, dan WebSocket proxying
🟡 Lanjutan
→ pelajari setelah proxy lancar: FastCGI PHP, Upstream Clusters, Algoritma Load Balancing (least_conn, ip_hash), Weight, dan Timeouts
🔴 Advanced / Operasional
→ penting untuk arsitektur skala besar: Proxy Caching (proxy_cache_path), Cache Bypass, Upstream Keepalive, dan Microservices GatewayMental model alur request Reverse Proxy & Upstream Load Balancer di NGINX:
PENGUNJUNG PUBLIK (Browser / Mobile App)
│
▼ Port 80 / 443
NGINX REVERSE PROXY & API GATEWAY
(SSL Termination, Rate Limiting & Proxy Cache)
│
┌───────────────────────────┼───────────────────────────┐
▼ (Cache HIT: ~1ms) ▼ (Cache MISS: Rute API) ▼ (Rute WebSocket)
Disk Proxy Cache Upstream Load Balancer Chat WebSocket Server
(Sajikan dari Memory) (Round-Robin / Least-Conn) (proxy_http_version 1.1)
│ │
┌──────────────┴──────────────┐ │
▼ ▼ ▼
Backend Node.js #1 Backend Node.js #2 Socket.io Cluster
(Port 3001) (Port 3002) (Port 4000)Hafalan:
Reverse Proxy → server perantara yang menerima request publik lalu meneruskannya ke backend internal privat
proxy_pass → direktif inti NGINX untuk meneruskan request HTTP ke server aplikasi backend
proxy_set_header → menyematkan data identitas asli client (Host, IP asli, Protokol) ke header request backend
Upgrade & Connection → dua header wajib untuk mengaktifkan koneksi dua arah real-time WebSocket
upstream → blok context penampung sekumpulan server backend untuk didistribusikan bebannya (Load Balancing)
least_conn → algoritma penyeimbang beban yang mengarahkan request ke server dengan koneksi aktif paling sedikit
ip_hash → algoritma load balancing yang mengunci IP client ke server backend tertentu (Sticky Session)
proxy_cache_path → mendefinisikan lokasi direktori disk dan ukuran memory zone untuk menyimpan cache respons backend
$upstream_cache_status → variabel pemantau status cache (HIT, MISS, BYPASS, EXPIRED, UPDATING)Daftar Isi
🟢 Fundamental
- Pengenalan Reverse Proxy di NGINX & Perbedaannya dengan Forward Proxy
- Direktif Dasar
proxy_pass - Perilaku Krusial Trailing Slash pada
proxy_pass - Proxy Headers Wajib: Menjaga Identitas Asli Client
- Reverse Proxy untuk WebSocket & Real-Time Connection
- FastCGI Proxying untuk Aplikasi PHP (Laravel & WordPress)
🟡 Lanjutan
- Upstream Context Dasar & Algoritma Default Round-Robin
- Load Balancing Algoritma 2: Least Connections (
least_conn;) - Load Balancing Algoritma 3: IP Hash (
ip_hash;) untuk Sticky Sessions - Parameter Server Upstream:
weight - Parameter Server Upstream:
max_fails,fail_timeout,backup, dandown - Mekanisme Health Checks Pasif & Automatic Failover
- Proxy Buffering: Menjaga Kestabilan Komunikasi Backend
- Proxy Timeouts: Menghindari Error 504 Gateway Timeout
🔴 Advanced / Operasional
- Pengenalan NGINX Proxy Caching & Konfigurasi
proxy_cache_path - Mengaktifkan dan Mengatur Cache Respons API
- Cache Bypass & No-Cache Conditions
- Status Header Cache: Memeriksa Cache HIT / MISS / EXPIRED
- Optimasi Upstream HTTP/1.1 Keepalive & Gzip
- Best Practice & Pola Arsitektur API Gateway Microservices
🛠️ Referensi & Praktik
- Peta Ingatan Cepat
- Tabel Ringkasan
- Cheat Code NGINX Reverse Proxy 10 Detik
- Urutan Belajar yang Disarankan
- Mini Project: Production-Ready High-Availability Microservices API Gateway with Upstream Load Balancer, WebSocket Support, and Dynamic Proxy Caching
- Referensi Resmi
1. 🟢 Pengenalan Reverse Proxy di NGINX & Perbedaannya dengan Forward Proxy
Konsep
- Forward Proxy (Proxy Biasa):
- Bertindak atas nama Client (Pengguna) untuk mengakses internet luar (misal: VPN atau proxy sensor kantor).
- Server tujuan tidak tahu IP asli pengguna.
- Reverse Proxy (NGINX):
- Bertindak atas nama Server (Backend).
- Klien luar hanya tahu domain publik (
api.perusahaan.com), tanpa tahu bahwa di belakang NGINX terdapat puluhan server Node.js, Spring Boot, atau Python yang berjalan di port internal (127.0.0.1:3000).
Keuntungan Menggunakan NGINX sebagai Reverse Proxy
- Keamanan & Isolasi: Port aplikasi internal tidak perlu dibuka ke internet publik.
- SSL Termination: NGINX menangani enkripsi HTTPS, backend internal cukup memproses HTTP polos yang ringan.
- Pusat Caching & Kompresi: Menghemat komputasi backend hingga 80%.
Hafalan:
Forward Proxy melindungi Client | Reverse Proxy melindungi dan membagi beban Server Backend2. 🟢 Direktif Dasar proxy_pass
Konsep
Direktif proxy_pass URL; digunakan di dalam blok location untuk meneruskan request masuk ke alamat backend tujuan (protokol http:// atau https://).
Contoh
server {
listen 80;
server_name api.tokokita.com;
# Teruskan seluruh request ke aplikasi Node.js/Express di port 3000
location / {
proxy_pass http://127.0.0.1:3000;
}
}Output
Browser: GET http://api.tokokita.com/users
NGINX ──> Meneruskan request ke http://127.0.0.1:3000/users
Node.js ──> Merespons JSON ──> NGINX ──> Browser PenggunaHafalan:
location / { proxy_pass http://127.0.0.1:3000; } → meneruskan request ke backend application server3. 🟢 Perilaku Krusial Trailing Slash pada proxy_pass
Konsep
Perbedaan paling penting dan sering menjadi jebakan developer di NGINX:
Konfigurasi proxy_pass | URI yang Dikirim ke Backend | Karakteristik |
|---|---|---|
Tanpa Slash: http://127.0.0.1:3000 | /api/v1/users /api/v1/users | Preserve URI: Path asli dipertahankan apa adanya. |
Dengan Slash: http://127.0.0.1:3000/ | /api/v1/users /users | Strip Location: Bagian /api/v1 dipotong dan diganti /. |
Contoh
# [1] Kasus Mempertahankan Path Lengkap (Standard Microservices):
location /api/ {
proxy_pass http://127.0.0.1:3000;
# Request /api/products -> diteruskan ke http://127.0.0.1:3000/api/products
}
# [2] Kasus Memotong Prefix URL:
location /v1/ {
proxy_pass http://127.0.0.1:4000/;
# Request /v1/orders -> diteruskan ke http://127.0.0.1:4000/orders (/v1/ dibuang!)
}Hafalan:
proxy_pass tanpa slash di akhir -> URI utuh | proxy_pass dengan slash di akhir -> location dipotong4. 🟢 Proxy Headers Wajib: Menjaga Identitas Asli Client
Konsep
Saat NGINX meneruskan request ke backend, backend akan melihat bahwa request berasal dari 127.0.0.1 (IP NGINX sendiri), bukan IP asli pengunjung!
4 Proxy Headers Wajib Standar Industri:
proxy_set_header Host $host;: Meneruskan nama domain asli yang diminta client.proxy_set_header X-Real-IP $remote_addr;: Meneruskan alamat IP publik asli client.proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;: Menyusun rantai IP jika melewati banyak proxy.proxy_set_header X-Forwarded-Proto $scheme;: Memberi tahu backend apakah client menggunakanhttpatauhttps.
Contoh
server {
listen 80;
server_name api.tokokita.com;
location / {
proxy_pass http://127.0.0.1:3000;
# 4 Header Wajib
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Hafalan:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; → menjaga data asli client sampai ke backend5. 🟢 Reverse Proxy untuk WebSocket & Real-Time Connection
Konsep
Protokol WebSocket bekerja dengan melakukan HTTP Handshake Upgrade dari HTTP/1.1 biasa menjadi koneksi dua arah persisten (Full-Duplex TCP).
Secara default, NGINX menggunakan HTTP/1.0 untuk proxy pass dan menutup koneksi persisten.
Untuk mengaktifkan WebSocket:
proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";
Contoh (Socket.io / ws)
server {
listen 80;
server_name chat.tokokita.com;
location /socket.io/ {
proxy_pass http://127.0.0.1:4000;
# Konfigurasi Wajib WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
# Timeout koneksi panjang untuk websocket (misal 24 jam)
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}
}Hafalan:
proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";6. 🟢 FastCGI Proxying untuk Aplikasi PHP (Laravel & WordPress)
Konsep
Aplikasi PHP dieksekusi via proses terpisah bernama PHP-FPM (FastCGI Process Manager).
NGINX berkomunikasi dengan PHP-FPM menggunakan protokol biner FastCGI (biasanya via UNIX Socket di /run/php/php8.x-fpm.sock atau TCP port 127.0.0.1:9000).
Contoh (Laravel NGINX Block)
server {
listen 80;
server_name laravel.tokokita.com;
root /var/www/laravel-app/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# Eksekusi File PHP via FastCGI Socket
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_hide_header X-Powered-By;
}
}Hafalan:
fastcgi_pass unix:/run/php/php-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;7. 🟡 Upstream Context Dasar & Algoritma Default Round-Robin
Konsep
Blok upstream name { ... } didefinisikan di dalam context http untuk mengelompokkan sekumpulan server backend (Cluster).
Algoritma Default: Round-Robin:
- Request pertama dikirim ke Server 1, request kedua ke Server 2, request ketiga ke Server 3, lalu kembali ke Server 1 secara bergiliran merata.
Contoh
http {
# Definisi Cluster Backend
upstream backend_nodes {
server 10.0.0.1:3000;
server 10.0.0.2:3000;
server 10.0.0.3:3000;
}
server {
listen 80;
server_name api.tokokita.com;
location / {
# Teruskan ke nama cluster upstream
proxy_pass http://backend_nodes;
}
}
}Hafalan:
upstream my_cluster { server srv1:3000; server srv2:3000; } → grup server load balancing round-robin8. 🟡 Load Balancing Algoritma 2: Least Connections (least_conn;)
Konsep
Algoritma least_conn;:
- NGINX memeriksa jumlah koneksi aktif pada setiap backend server.
- Request baru selalu diarahkan ke server yang saat itu sedang menangani koneksi paling sedikit.
- Sangat ideal untuk API yang durasi prosesnya bervariasi (misal: query database berat atau pemrosesan video).
Contoh
upstream dynamic_api_cluster {
least_conn; # Aktifkan Least Connections
server 10.0.0.1:3000;
server 10.0.0.2:3000;
server 10.0.0.3:3000;
}Hafalan:
least_conn; → mendistribusikan request ke backend yang beban koneksi aktifnya paling rendah9. 🟡 Load Balancing Algoritma 3: IP Hash (ip_hash;) untuk Sticky Sessions
Konsep
Algoritma ip_hash;:
- Menggunakan 3 oktet pertama alamat IPv4 client sebagai kunci hash untuk menentukan server backend.
- Menjamin bahwa pengunjung dengan IP yang sama akan selalu diarahkan ke backend server yang sama (Session Stickiness).
- Berguna untuk aplikasi monolitik lama yang menyimpan session di memory server lokal.
Contoh
upstream stateful_app_cluster {
ip_hash; # Kunci IP client ke server tertentu
server 10.0.0.1:3000;
server 10.0.0.2:3000;
}Hafalan:
ip_hash; → mengunci client IP ke server yang sama untuk menjaga sticky session10. 🟡 Parameter Server Upstream: weight
Konsep
Jika Anda memiliki server dengan spesifikasi hardware berbeda (misal: Server A memiliki 16 Core CPU dan Server B hanya 4 Core CPU):
Gunakan parameter weight=N:
- Menentukan bobot pembagian trafik secara proporsional.
Contoh
upstream weighted_cluster {
# Server A menerima 3 dari setiap 4 request (75% trafik)
server 10.0.0.1:3000 weight=3;
# Server B menerima 1 dari setiap 4 request (25% trafik)
server 10.0.0.2:3000 weight=1;
}Hafalan:
server 10.0.0.1:3000 weight=3; → mengatur porsi pembagian beban trafik sesuai kapasitas server11. 🟡 Parameter Server Upstream: max_fails, fail_timeout, backup, dan down
Konsep
Parameter manajemen keandalan server:
max_fails=3 fail_timeout=30s;: Jika server gagal merespons 3 kali dalam 30 detik, NGINX akan menganggap server mati selama 30 detik berikutnya.backup;: Server cadangan yang HANYA menerima trafik jika seluruh server utama mati total.down;: Menandai server sedang offline/maintenance tanpa perlu menghapus baris konfigurasi.
Contoh
upstream resilient_cluster {
server 10.0.0.1:3000 max_fails=3 fail_timeout=10s;
server 10.0.0.2:3000 max_fails=3 fail_timeout=10s;
# Server Cadangan Darurat (Disaster Recovery):
server 10.0.0.3:3000 backup;
# Server Sedang Maintenance:
server 10.0.0.4:3000 down;
}Hafalan:
backup -> aktif saat semua server mati | down -> tandai offline maintenance12. 🟡 Mekanisme Health Checks Pasif & Automatic Failover
Konsep
Direktif proxy_next_upstream:
Memberitahu NGINX: jika backend server pertama mengembalikan error atau timeout, segera oper request tersebut ke backend server berikutnya di cluster sebelum mengirim error ke browser pengguna.
Contoh
location / {
proxy_pass http://resilient_cluster;
# Failover otomatis jika server pertama error 502, 503, atau timeout
proxy_next_upstream error timeout http_502 http_503 http_504;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;
}Hafalan:
proxy_next_upstream error timeout http_502; → otomatis mengoper request ke server cadangan jika server utama gagal13. 🟡 Proxy Buffering: Menjaga Kestabilan Komunikasi Backend
Konsep
proxy_buffering on; (Default Aktif):
- NGINX membaca seluruh respon dari backend ke dalam memory buffer secepat mungkin, sehingga proses worker backend segera bebas melayani request lain.
- Respon kemudian dikirimkan secara bertahap ke client (meskipun koneksi internet client lambat).
Direktif Buffer:
proxy_buffer_size 128k;: Buffer untuk HTTP headers respon backend.proxy_buffers 4 256k;: 4 alokasi buffer berukuran 256k untuk body respon.
Hafalan:
proxy_buffering on; proxy_buffers 4 256k; → mengisolasi backend dari koneksi internet client yang lambat14. 🟡 Proxy Timeouts: Menghindari Error 504 Gateway Timeout
Konsep
Tiga Direktif Timeout Inti:
proxy_connect_timeout 60s;: Waktu maksimal membangun handshake koneksi TCP ke backend.proxy_send_timeout 60s;: Waktu maksimal mengirim data request ke backend.proxy_read_timeout 60s;: Waktu maksimal NGINX menunggu balasan respon dari backend sebelum memunculkan 504 Gateway Timeout.
Contoh
location /api/heavy-export/ {
proxy_pass http://backend_nodes;
# Naikkan timeout menjadi 300 detik untuk ekspor laporan data besar
proxy_connect_timeout 10s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}Hafalan:
proxy_read_timeout 300s; → durasi maksimal menunggu respon pemrosesan data dari server backend15. 🔴 Pengenalan NGINX Proxy Caching & Konfigurasi proxy_cache_path
Konsep
NGINX Proxy Caching: Menyimpan salinan respons HTTP dari backend server ke disk lokal NGINX. Request berikutnya untuk URL yang sama akan disajikan langsung oleh NGINX dalam ~1 milidetik tanpa menyentuh database backend.
Konfigurasi Direktori Cache (Wajib di Blok http {}):
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache_zone:10m max_size=2g inactive=60m use_temp_path=off;
levels=1:2: Struktur hierarki subfolder penyimpanan cache di disk.keys_zone=my_cache_zone:10m: Alokasi 10MB RAM untuk menyimpan metadata index kunci cache (~80.000 URL).max_size=2g: Batas maksimal ukuran disk untuk cache (2 Gigabyte).inactive=60m: File cache yang tidak diakses selama 60 menit akan dihapus otomatis.
Hafalan:
proxy_cache_path /var/cache/nginx keys_zone=api_cache:10m max_size=1g; → membuat storage cache respon API16. 🔴 Mengaktifkan dan Mengatur Cache Respons API
Konsep
Di dalam blok server atau location:
proxy_cache cache_zone_name;: Mengaktifkan cache menggunakan zone yang telah didefinisikan.proxy_cache_valid 200 302 10m;: Menyimpan respon status 200/302 selama 10 menit.proxy_cache_valid 404 1m;: Menyimpan respon 404 selama 1 menit.
Contoh
location /api/public/products {
proxy_pass http://backend_nodes;
proxy_cache api_cache;
proxy_cache_valid 200 15m;
proxy_cache_valid 404 1m;
}Hafalan:
proxy_cache api_cache; proxy_cache_valid 200 10m; → mengaktifkan cache respons sukses HTTP 200 selama 10 menit17. 🔴 Cache Bypass & No-Cache Conditions
Konsep
Tidak semua request boleh di-cache (misal: request pengguna yang sudah login atau request yang menyertakan header Cache-Control: no-cache).
Direktif:
proxy_cache_bypass $variable;: Jika variabel bernilai tidak nol/tidak kosong, NGINX akan mengambil data segar langsung dari backend.proxy_no_cache $variable;: Respons yang diterima tidak akan disimpan ke cache.
Contoh
location /api/ {
proxy_pass http://backend_nodes;
proxy_cache api_cache;
proxy_cache_valid 200 10m;
# Bypass cache jika client mengirim header 'Pragma: no-cache' atau cookie session
proxy_cache_bypass $http_pragma $cookie_session_id;
proxy_no_cache $cookie_session_id;
}Hafalan:
proxy_cache_bypass $cookie_auth; → melewati cache jika request memiliki cookie otentikasi18. 🔴 Status Header Cache: Memeriksa Cache HIT / MISS / EXPIRED
Konsep
Untuk memeriksa apakah request dilayani dari memory cache NGINX atau dari backend server:
Gunakan variabel $upstream_cache_status dan kirimkan via header HTTP:
HIT: Data disajikan langsung dari cache NGINX (Ultra Fast).MISS: Data belum ada di cache, diambil dari backend lalu disimpan ke cache.BYPASS: Cache dilewati secara sengaja.EXPIRED: Cache sudah kadaluwarsa, data baru sedang diambil dari backend.
Contoh
location /api/ {
proxy_pass http://backend_nodes;
proxy_cache api_cache;
proxy_cache_valid 200 10m;
# Sematkan status cache ke browser
add_header X-Cache-Status $upstream_cache_status always;
}Hasil Header di Browser Developer Tools
HTTP/1.1 200 OK
Content-Type: application/json
X-Cache-Status: HITHafalan:
add_header X-Cache-Status $upstream_cache_status always; → memantau efektivitas caching NGINX (HIT/MISS)19. 🔴 Optimasi Upstream HTTP/1.1 Keepalive & Gzip
Konsep
Secara default, NGINX membuka dan menutup koneksi TCP baru untuk setiap request ke upstream backend (Connection: close).
Dengan mengaktifkan Upstream Keepalive Connection Pools: Koneksi TCP antara NGINX dan backend server tetap terbuka (Reused), memangkas TCP 3-way handshake overhead hingga 50%.
Contoh
upstream optimized_backend {
server 10.0.0.1:3000;
server 10.0.0.2:3000;
# Pertahankan 32 koneksi TCP idle tetap hidup ke setiap backend
keepalive 32;
}
server {
listen 80;
location / {
proxy_pass http://optimized_backend;
# Konfigurasi Wajib untuk Mengaktifkan Keepalive ke Upstream
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}Hafalan:
keepalive 32; proxy_http_version 1.1; proxy_set_header Connection ""; → mengaktifkan connection pooling ke backend20. 🔴 Best Practice & Pola Arsitektur API Gateway Microservices
Konsep
Dalam arsitektur Microservices, NGINX bertindak sebagai Unified API Gateway:
- Domain Publik Tunggal:
https://api.perusahaan.com - Routing Berbasis Path:
/api/v1/auth/Auth Service (Node.js)/api/v1/users/User Service (Spring Boot)/api/v1/orders/Order Service (Go)/api/v1/analytics/Analytics Service (Python)
Hafalan:
Pola API Gateway Microservices → rute URL publik tunggal yang memetakan path ke cluster microservice internal21. 🛠️ Peta Ingatan Cepat
PETA ARSITEKTUR NGINX REVERSE PROXY & LOAD BALANCER
│
┌────────────────────────────────┼────────────────────────────────┐
▼ ▼ ▼
REVERSE PROXY & HEADERS UPSTREAM LOAD BALANCING PROXY CACHING & PERFORMANCE
├─ proxy_pass (Trailing Slash) ├─ round-robin (Default) ├─ proxy_cache_path (Disk/RAM)
├─ 4 Proxy Headers Wajib ├─ least_conn & ip_hash ├─ proxy_cache_valid 200 10m
├─ WebSocket (Upgrade/1.1) ├─ weight, backup & down ├─ proxy_cache_bypass
└─ FastCGI unix:/php.sock └─ proxy_next_upstream failover └─ X-Cache-Status ($upstream)22. 📚 Tabel Ringkasan
| Direktif / Parameter | Context | Fungsi & Karakteristik Utama |
|---|---|---|
proxy_pass | location | Meneruskan request HTTP ke backend internal |
proxy_set_header | http/server/location | Menyematkan header identitas client (Host, X-Real-IP) |
proxy_http_version 1.1 | http/server/location | Wajib untuk WebSocket dan Upstream Keepalive Connection |
fastcgi_pass | location | Meneruskan request ke socket proses PHP-FPM |
upstream | http | Mendefinisikan kelompok cluster server backend |
least_conn | upstream | Algoritma penyeimbang ke server dengan koneksi terendah |
ip_hash | upstream | Algoritma pengunci IP ke server tertentu (Sticky Session) |
weight=N | upstream server | Menentukan porsi bobot pembagian beban trafik |
backup | upstream server | Menandai server cadangan darurat |
proxy_cache_path | http | Menentukan lokasi direktori disk dan RAM key zone cache |
proxy_cache_valid | http/server/location | Menentukan durasi masa aktif cache per status HTTP |
proxy_read_timeout | http/server/location | Batas waktu menunggu respon backend (Mencegah 504) |
23. ⚡ Cheat Code NGINX Reverse Proxy 10 Detik
# [1] Template Universal Reverse Proxy Node.js / Nuxt / Go
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# [2] Template Upstream Weighted Cluster
upstream app_cluster {
least_conn;
server 10.0.0.1:3000 weight=3 max_fails=3 fail_timeout=10s;
server 10.0.0.2:3000 weight=1 max_fails=3 fail_timeout=10s;
server 10.0.0.3:3000 backup;
}24. 🧭 Urutan Belajar yang Disarankan
Langkah 1: Kuasai Dasar Reverse Proxy & 4 Header Wajib
├── Konfigurasi proxy_pass ke aplikasi Node.js / Python lokal
└── Pasang proxy_set_header Host, X-Real-IP, dan X-Forwarded-*
│
▼
Langkah 2: Terapkan Upstream Load Balancing & Failover
├── Definisikan cluster upstream dengan algoritma round-robin / least_conn
└── Pasang parameter weight, backup, dan proxy_next_upstream failover
│
▼
Langkah 3: Konfigurasi WebSocket & FastCGI PHP-FPM
├── Pasang header Upgrade & Connection "upgrade" untuk real-time chat
└── Integrasikan fastcgi_pass socket untuk aplikasi Laravel / PHP
│
▼
Langkah 4: Optimasi Performa dengan Proxy Caching & Keepalive
├── Buat direktori proxy_cache_path dan pasang proxy_cache_valid
└── Pantau efisiensi cache via header X-Cache-Status ($upstream_cache_status)
│
▼
Langkah 5: Siap Melangkah ke NGINX Keamanan, SSL/TLS & Performance Tuning!25. 🏗️ Mini Project: Production-Ready High-Availability Microservices API Gateway with Upstream Load Balancer, WebSocket Support, and Dynamic Proxy Caching
Berkas konfigurasi NGINX enterprise lengkap, modular, dan runnable: Pola API Gateway Microservices (Upstream Cluster Node.js dengan Weight, Layanan Chat WebSocket Real-Time, Backend Monolith Laravel FastCGI, API Public Proxy Caching dengan Header Status, dan Keepalive Pooling).
# =========================================================================
# /etc/nginx/conf.d/microservices_gateway.conf
# =========================================================================
# -------------------------------------------------------------------------
# [1] PROXY CACHE PATH DEFINITION (DILETAKKAN DI HTTP CONTEXT)
# -------------------------------------------------------------------------
# proxy_cache_path /var/cache/nginx/api_cache
# levels=1:2
# keys_zone=GATEWAY_CACHE:20m
# max_size=2g
# inactive=60m
# use_temp_path=off;
# -------------------------------------------------------------------------
# [2] UPSTREAM CLUSTERS & LOAD BALANCERS
# -------------------------------------------------------------------------
# Cluster API Produk (Weighted Least Connections)
upstream product_service_cluster {
least_conn;
server 10.0.1.10:3000 weight=3 max_fails=2 fail_timeout=5s;
server 10.0.1.11:3000 weight=2 max_fails=2 fail_timeout=5s;
server 10.0.1.12:3000 backup; # Server Cadangan
keepalive 32;
}
# Cluster Layanan Chat Real-Time (IP Hash Sticky Session)
upstream chat_service_cluster {
ip_hash;
server 10.0.2.10:4000;
server 10.0.2.11:4000;
}
# -------------------------------------------------------------------------
# [3] API GATEWAY VIRTUAL HOST
# -------------------------------------------------------------------------
server {
listen 80;
server_name api.tokokita.com;
# Batas Request Body
client_max_body_size 20M;
# Logging Gateway
access_log /var/log/nginx/gateway_access.log combined;
error_log /var/log/nginx/gateway_error.log warn;
# ---------------------------------------------------------------------
# RUTE 1: PUBLIC PRODUCTS API (DENGAN NGINX PROXY CACHE)
# ---------------------------------------------------------------------
location /api/v1/products/ {
proxy_pass http://product_service_cluster;
# Keepalive Upstream
proxy_http_version 1.1;
proxy_set_header Connection "";
# Client Identity Headers
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Konfigurasi Cache Respons API
proxy_cache GATEWAY_CACHE;
proxy_cache_valid 200 10m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503;
# Bypass Cache untuk Request Khusus
proxy_cache_bypass $http_cache_control $cookie_auth_token;
proxy_no_cache $cookie_auth_token;
# Header Status Cache untuk Debugging
add_header X-Cache-Status $upstream_cache_status always;
# Timeouts & Automatic Failover
proxy_connect_timeout 5s;
proxy_read_timeout 30s;
proxy_next_upstream error timeout http_502 http_503;
}
# ---------------------------------------------------------------------
# RUTE 2: REAL-TIME WEBSOCKET CHAT GATEWAY
# ---------------------------------------------------------------------
location /socket.io/ {
proxy_pass http://chat_service_cluster;
# Protokol WebSocket Upgrade
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# Durasi Koneksi Persisten Panjang (24 Jam)
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}
# ---------------------------------------------------------------------
# RUTE 3: MONOLITH LARAVEL BACKOFFICE (FASTCGI PHP-FPM)
# ---------------------------------------------------------------------
location /admin/ {
root /var/www/tokokita_admin/public;
try_files $uri $uri/ /admin/index.php?$query_string;
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
}
}
}Hasil Validasi Sintaks & Pengujian Terminal
sudo nginx -tOutput
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful