Lewati ke konten

4. Reverse Proxy

Aplikasi seperti Node.js, Go, atau Python biasanya berjalan di port tinggi (3000, 8080, …). Daripada membukanya langsung ke internet, kita taruh nginx di depan:

Pengunjung ──▶ nginx :80/:443 ──▶ aplikasi 127.0.0.1:3000

Keuntungannya: satu pintu masuk untuk banyak aplikasi, HTTPS cukup dipasang di nginx, aplikasi tidak terekspos langsung, dan nginx bisa menyajikan file statis dengan sangat cepat.

server {
listen 80;
server_name api.local;
location / {
proxy_pass http://127.0.0.1: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;
}
}

Tanpa header-header itu, aplikasi akan mengira semua pengunjung datang dari 127.0.0.1 lewat HTTP biasa. X-Forwarded-Proto penting agar aplikasi tahu pengunjung sebenarnya memakai HTTPS.

Path di proxy_pass — detail kecil yang penting

Section titled “Path di proxy_pass — detail kecil yang penting”
location /api/ {
proxy_pass http://127.0.0.1:3000; # /api/users → backend menerima /api/users
}
location /api/ {
proxy_pass http://127.0.0.1:3000/; # /api/users → backend menerima /users
}

Tanpa path di belakang port, path asli diteruskan utuh. Dengan / di belakang port, bagian yang cocok dengan location dibuang. GSTNV-LAB memakai bentuk pertama untuk /learn/, karena situs belajar memang dibangun dengan path /learn/.

Kalau backend mati atau port-nya salah, nginx menjawab 502 Bad Gateway. Langkah diagnosis:

Terminal window
curl localhost:3000 # backend menjawab langsung?
docker ps # container-nya jalan?
sudo tail -n 5 /var/log/nginx/error.log # "connect() failed (111: Connection refused)"
Lab: Reverse proxy ke aplikasi
Misi 0/8
  1. Jalankan aplikasi backend di container, port 3000.
    Petunjukdocker run -d --name api -p 3000:3000 gstnv/hello-app
  2. Pastikan aplikasinya menjawab langsung di port 3000.
    Petunjukcurl localhost:3000
  3. Pasang konfigurasi api.conf di sites-available.
    Petunjuksudo cp ~/api.conf /etc/nginx/sites-available/api
  4. Isi port aplikasi yang benar pada proxy_pass.
    Petunjuksudo sed -i 's/PORT_APLIKASI/3000/' /etc/nginx/sites-available/api
  5. Aktifkan situs api.
    Petunjuksudo ln -s /etc/nginx/sites-available/api /etc/nginx/sites-enabled/
  6. Tes lalu reload dalam satu baris.
    Petunjuksudo nginx -t && sudo systemctl reload nginx
  7. Akses aplikasi lewat nginx.
    Petunjukcurl http://api.local
  8. Matikan backend lalu akses lagi — nginx menjawab 502.
    Petunjukdocker stop api lalu curl -I http://api.local