Lewati ke konten utama
  1. Server/

Reverse Proxy dengan Nginx: Panduan Lengkap

Penulis
GezyTech
Menulis tentang AI, Linux, Server, Docker, dan teknologi lainnya.

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:

  1. Server dengan Nginx terpasang.
  2. Satu aplikasi backend yang berjalan di port tertentu.
  3. (Opsional) Nama domain yang menunjuk ke server.

Instalasi Nginx
#

sudo apt update
sudo apt install -y nginx

Verifikasi:

sudo systemctl status nginx

Konfigurasi Reverse Proxy Dasar
#

Buat file konfigurasi baru:

sudo nano /etc/nginx/sites-available/appku

Isi 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 nginx

Sekarang 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.com

Certbot 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:3000

Pastikan 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.log

Keamanan
#

  • Jangan expose port backend (3000) ke publik — biarkan hanya 127.0.0.1.
  • Selalu aktifkan HTTPS untuk domain publik.
  • Batasi akses dengan firewall.
  • Gunakan header X-Forwarded-For dengan 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/