TLDR #
Reverse proxy adalah server yang duduk di depan aplikasi backend dan meneruskan request dari client ke backend tersebut. Nginx adalah pilihan paling populer untuk ini. Dengan satu file konfigurasi proxy_pass, kamu bisa menghubungkan nama domain ke aplikasi yang berjalan di port lain (misalnya aplikasi Node.js di port 3000), lengkap dengan load balancing dan HTTPS.
Pendahuluan #
Saat aplikasi kamu berjalan di port tertentu (Node.js di 3000, Python di 8000, dsb.), kamu tidak ingin user mengakses http://domain.com:3000. Lebih baik mereka mengakses https://domain.com dan Nginx-lah yang meneruskan ke port internal.
Inilah fungsi reverse proxy. Ia menerima request dari internet, lalu meneruskannya ke satu atau beberapa server backend di jaringan internal.
Kenapa pakai reverse proxy? #
| Manfaat | Penjelasan |
|---|---|
| Port tunggal | Hanya port 80/443 yang terbuka ke publik |
| HTTPS terpusat | SSL dikelola di satu tempat |
| Load balancing | Membagi trafik ke banyak backend |
| Keamanan | Menyembunyikan backend dari internet langsung |
| Caching | Menyimpan respons statis di proxy |
Prasyarat #
Siapkan:
- Server dengan Nginx terpasang.
- Satu aplikasi backend yang berjalan di port tertentu.
- (Opsional) Nama domain yang menunjuk ke server.
Instalasi Nginx #
sudo apt update
sudo apt install -y nginxVerifikasi:
sudo systemctl status nginxKonfigurasi Reverse Proxy Dasar #
Buat file konfigurasi baru:
sudo nano /etc/nginx/sites-available/appkuIsi dengan:
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
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;
}
}Aktifkan dan reload:
sudo ln -s /etc/nginx/sites-available/appku /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxSekarang request ke app.example.com diteruskan ke aplikasi di 127.0.0.1:3000.
Penjelasan Directive Penting #
| Directive | Fungsi |
|---|---|
proxy_pass |
Alamat backend tujuan |
proxy_http_version 1.1 |
Menggunakan HTTP/1.1 (wajib untuk WebSocket) |
proxy_set_header Host |
Meneruskan host asli agar aplikasi tahu domain yang diakses |
X-Real-IP / X-Forwarded-For |
Meneruskan IP asli client |
X-Forwarded-Proto |
Memberitahu backend apakah request via HTTPS |
Load Balancing #
Jika punya beberapa instance backend, Nginx bisa membagi trafik:
upstream backend_app {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend_app;
}
}Nginx akan mendistribusikan request ke ketiga backend secara bergilir (round-robin).
Metode load balancing #
| Metode | Konfigurasi | Cocok untuk |
|---|---|---|
| Round-robin | (default) | Umum |
| Least connections | least_conn; |
Backend dengan beban bervariasi |
| IP hash | ip_hash; |
Sesi yang harus konsisten per user |
| Weighted | server ... weight=3; |
Backend dengan kapasitas beda |
WebSocket #
Aplikasi realtime (chat, notifikasi) memakai WebSocket. Tambahkan header upgrade:
location /ws {
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;
}Timeout #
Untuk proses yang lama (upload besar, query berat), sesuaikan timeout:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 120s;
}Integrasi HTTPS dengan Certbot #
Pasang Certbot lalu aktifkan SSL:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d app.example.comCertbot otomatis menambahkan konfigurasi SSL dan redirect HTTP ke HTTPS.
Troubleshooting #
502 Bad Gateway
#
Nginx tidak bisa terhubung ke backend. Periksa:
sudo ss -ltnp | grep 3000
curl -I http://127.0.0.1:3000Pastikan backend berjalan dan mendengarkan di alamat yang benar.
504 Gateway Timeout
#
Backend terlalu lama merespons. Naikkan proxy_read_timeout atau optimalkan backend.
Konfigurasi tidak aktif #
sudo nginx -t # cek sintaks
sudo systemctl reload nginx
sudo tail -f /var/log/nginx/error.logKeamanan #
- Jangan expose port backend (
3000) ke publik — biarkan hanya127.0.0.1. - Selalu aktifkan HTTPS untuk domain publik.
- Batasi akses dengan firewall.
- Gunakan header
X-Forwarded-Fordengan hati-hati — validasi jika aplikasi butuh IP asli.
Ringkasan #
| Konsep | Inti |
|---|---|
| Reverse proxy | Nginx meneruskan request ke backend |
proxy_pass |
Alamat backend |
upstream |
Grup backend untuk load balancing |
| WebSocket | Butuh header Upgrade |
| HTTPS | Kelola SSL di Nginx via Certbot |
Dokumentasi resmi: nginx.org/en/docs/