Konsep Reverse Proxy #
Sebelum masuk ke konfigurasi, penting untuk memahami apa sebenarnya yang terjadi ketika Nginx bekerja sebagai reverse proxy — karena pemahaman ini akan membuat semua konfigurasi berikutnya jauh lebih masuk akal.
Forward Proxy vs Reverse Proxy #
Kata “proxy” berarti perantara. Yang membedakan forward proxy dan reverse proxy adalah untuk siapa ia menjadi perantara.
Forward proxy bekerja untuk klien. Klien mengkonfigurasi browser/aplikasinya untuk mengirim semua request melalui proxy. Server tujuan melihat IP proxy, bukan IP klien asli. Ini yang digunakan untuk VPN, filter konten perusahaan, atau bypass geo-restriction.
Forward proxy:
Klien → [Proxy] → Internet
(Klien tahu tentang proxy, server tidak)
Reverse proxy bekerja untuk server. Klien mengirim request ke proxy tanpa tahu ada server lain di baliknya. Proxy meneruskan request ke server yang tepat dan mengembalikan responsnya.
Reverse proxy:
Internet → [Nginx] → Server Aplikasi
(Server tahu tentang proxy, klien tidak)
Nginx sebagai reverse proxy terlihat seperti server akhir dari sudut pandang browser — browser hanya berkomunikasi dengan Nginx, tidak pernah langsung ke Node.js atau Python yang ada di belakangnya.
Mengapa Hampir Semua Aplikasi Production Menggunakan Reverse Proxy #
Ada beberapa alasan praktis mengapa menempatkan Nginx di depan server aplikasi sudah menjadi standar industri:
SSL termination. Nginx menangani enkripsi/dekripsi HTTPS. Backend menerima HTTP biasa tanpa perlu mengurus sertifikat dan overhead TLS — ini lebih sederhana dan kadang lebih efisien karena Nginx sangat dioptimalkan untuk ini.
Serving file statis. Nginx jauh lebih efisien dari Node.js atau Python untuk menyajikan file statis. Gambar, CSS, JS bisa dilayani Nginx langsung tanpa menyentuh server aplikasi sama sekali.
Melindungi port aplikasi. Server aplikasi bisa berjalan di port non-standar (3000, 8000, 8080) yang tidak perlu terekspos ke publik. Hanya port 80/443 Nginx yang terbuka ke internet.
Buffer untuk koneksi lambat. Nginx menerima request dari klien yang lambat secara penuh sebelum meneruskan ke backend. Tanpa ini, koneksi lambat bisa menahan thread di server aplikasi.
Satu entry point untuk banyak service. Routing berbasis path memungkinkan banyak service berjalan di belakang satu domain tanpa klien perlu tahu detail infrastrukturnya.
Contoh: satu domain, beberapa service
example.com/ → React app (static files)
example.com/api/ → Node.js API server
example.com/admin/ → Python Django admin
example.com/uploads/ → File storage server
Semuanya lewat satu Nginx, klien tidak tahu ada 4 service berbeda
Alur Request di Reverse Proxy #
Memahami alur ini penting untuk debugging ketika ada masalah:
1. Browser kirim request ke Nginx
GET /api/users HTTP/1.1
Host: example.com
2. Nginx terima request, cek konfigurasi location
3. Nginx buka koneksi ke backend (jika belum ada keepalive)
Nginx bertindak sebagai HTTP client terhadap backend
4. Nginx teruskan request ke backend
GET /api/users HTTP/1.1
Host: example.com
X-Real-IP: 203.0.113.1 ← Nginx tambahkan header ini
X-Forwarded-For: 203.0.113.1
5. Backend proses request, kirim response ke Nginx
6. Nginx terima response dari backend
7. Nginx teruskan response ke browser
(bisa dimodifikasi, di-cache, atau dikompresi dulu)
8. Nginx catat request ke access log
Satu hal yang sering diabaikan: Nginx membuat dua koneksi terpisah — satu ke klien, satu ke backend. Ini berarti ada dua “pasang” timeout yang perlu diperhatikan.
Apa yang Nginx Lakukan dan Tidak Lakukan dengan Request #
Ketika meneruskan request, secara default Nginx:
- Mengubah versi HTTP ke 1.0 untuk koneksi ke backend (bisa diubah ke 1.1)
- Menghapus header yang berisi underscore dari klien
- Menghapus header
Connectiondan hop-by-hop headers lainnya - Menambahkan header
Hostke nama backend (bukan domain asli klien)
Karena itu, backend yang butuh tahu IP asli klien atau domain aslinya perlu mengambil dari header tambahan yang Nginx sertakan (jika dikonfigurasi):
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;
proxy_set_header Host $host;
Tanpa header-header ini, backend hanya akan melihat IP Nginx sebagai IP klien dan tidak tahu apakah koneksi asal menggunakan HTTP atau HTTPS.
Ringkasan #
- Reverse proxy bekerja untuk server — klien berkomunikasi dengan Nginx, tidak langsung ke aplikasi.
- Manfaat utama: SSL termination, serving file statis efisien, melindungi port backend, buffering koneksi lambat, routing terpusat.
- Nginx membuat dua koneksi terpisah: satu ke klien, satu ke backend — masing-masing dengan timeout sendiri.
- Secara default Nginx memodifikasi beberapa header saat meneruskan request — backend butuh header tambahan (
X-Real-IP,X-Forwarded-For) untuk mendapatkan informasi asli klien.