Belajar Nginx - NGINX sebagai Reverse Proxy
Episode 6 of 21

Belajar Nginx - NGINX sebagai Reverse Proxy

Episode ini menjelaskan konsep forward proxy versus reverse proxy, konfigurasi dasar proxy_pass, penerusan header penting ke backend, serta manajemen timeout dan buffering koneksi proxy.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Inilah salah satu peran NGINX yang paling banyak dipakai di industri: reverse proxy. Aplikasi modern seperti Node.js, Go, Python, dan Java hampir selalu disembunyikan di balik NGINX, baik untuk keamanan, performa, maupun fleksibilitas. Episode 6 ini membahas konsep dan konfigurasinya.

Kalian akan memahami apa beda forward proxy dengan reverse proxy, menulis directive proxy_pass yang benar, meneruskan header penting agar aplikasi tahu alamat asli klien, serta mengatur timeout dan buffering agar koneksi proxy stabil di produksi.

Konsep Forward Proxy vs Reverse Proxy

Forward Proxy Mewakili Klien

Forward proxy berdiri di depan klien. Browser memakai proxy untuk keluar ke internet; server di luar hanya melihat alamat proxy, bukan alamat klien. Contohnya proxy kantor atau layanan VPN berbasis proxy.

Reverse Proxy Mewakili Server

Reverse proxy berdiri di depan server. Klien mengakses domain public, NGINX meneruskan request ke backend, dan aplikasi tidak pernah terekspos langsung ke internet. Manfaatnya:

  • Backend aplikasi tidak perlu port public; hanya NGINX yang terbuka.
  • TLS, caching, rate limiting, dan kompresi ditangani di satu titik.
  • Backend bisa diganti, diskalakan, atau dipindahkan tanpa mengubah URL klien.
Reverse proxy paling sederhana
server {
    listen 80;
    server_name app.example.com;
 
    location / {
        proxy_pass http://localhost:3000;
    }
}

Setiap request ke app.example.com diteruskan ke aplikasi yang berjalan di port 3000.

Konfigurasi Dasar proxy_pass

Tanpa dan Dengan Path

Directive proxy_pass bisa menulis ulang URI saat diteruskan. Perbedaan halus berikut sering mengecoh:

proxy_pass tanpa dan dengan path
location / {
    proxy_pass http://localhost:3000;
}
 
location /api/ {
    proxy_pass http://localhost:3000;
}
 
location /static/ {
    proxy_pass http://localhost:3000/assets/;
}

Ketika proxy_pass tidak memakai path (seperti http://localhost:3000), URI request diteruskan apa adanya. Ketika memakai path (seperti /assets/), bagian URI yang cocok dengan location diganti. Ini aturan yang harus kalian pegang erat.

Menggunakan Variabel di proxy_pass

NGINX juga menerima variabel pada proxy_pass, misalnya saat backend dipilih berdasarkan header:

proxy_pass dengan variabel
server {
    listen 80;
    server_name app.example.com;
 
    set $backend http://localhost:3000;
 
    location / {
        proxy_pass $backend;
    }
}

Ingat: begitu proxy_pass memakai variabel, NGINX tidak lagi melakukan penulisan ulang URI otomatis. Selalu uji kombinasi ini dengan nginx -t.

Passing Essential Request Headers ke Backend

Header yang Wajib Diteruskan

Tanpa penerusan header, aplikasi tidak akan tahu dari mana request datang:

Header penting untuk backend
location / {
    proxy_pass http://localhost:3000;
 
    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;
}
  • Host $host — nama domain yang diminta klien.
  • X-Real-IP — IP asli klien.
  • X-Forwarded-For — daftar IP di belakang proxy.
  • X-Forwarded-Proto — skema asli, http atau https.

Banyak framework membaca header ini untuk logging, rate limiting per IP, dan membuat URL absolut. Jangan pernah mengirimnya tanpa verifikasi, karena aplikasi yang menganggap X-Forwarded-For bisa dimanipulasi rawan spoofing.

Manajemen Timeouts dan Buffering Proxy

Timeout Koneksi

Backend yang lambat bisa menggantung worker NGINX. Atur batas waktunya:

Timeout proxy
location / {
    proxy_pass http://localhost:3000;
 
    proxy_connect_timeout 10s;
    proxy_read_timeout 60s;
    proxy_send_timeout 60s;
}
  • proxy_connect_timeout — batas waktu membuat koneksi ke backend.
  • proxy_read_timeout — batas waktu menunggu respons dari backend.
  • proxy_send_timeout — batas waktu mengirim request ke backend.

Buffering

NGINX menampung respons backend di buffer sebelum dikirim ke klien:

Konfigurasi buffering
location / {
    proxy_pass http://localhost:3000;
    proxy_buffering on;
    proxy_buffer_size 8k;
    proxy_buffers 8 8k;
}

Buffering membuat klien lambat tidak menahan backend. Untuk aplikasi realtime seperti SSE atau streaming, buffering justru dimatikan — detailnya ada di episode 13.

Penutup

Episode 6 memantapkan peran NGINX sebagai reverse proxy: kalian memahami perbedaan forward dan reverse proxy, menulis proxy_pass dengan dan tanpa path, meneruskan header penting, serta mengatur timeout dan buffering.

Inti yang harus dibawa pulang:

  • Reverse proxy mewakili server, forward proxy mewakili klien.
  • proxy_pass tanpa path meneruskan URI asli; dengan path menulis ulang URI.
  • Wajib meneruskan Host, X-Real-IP, X-Forwarded-For, dan X-Forwarded-Proto.
  • Jangan percaya X-Forwarded-For dari luar tanpa validasi.
  • Timeout proxy mencegah worker menunggu backend yang lambat selamanya.
  • Buffering melindungi backend dari klien yang lambat.

Di episode 7 selanjutnya kita akan membahas load balancing algorithms dan upstream management — mendefinisikan cluster backend dengan block upstream, algoritma round robin, least connections, IP hash, dan generic hash, plus health check pasif dan state server.

Belajar Nginx - NGINX sebagai Reverse Proxy | Belajar Nginx