4. Reverse Proxy
Apa itu reverse proxy?
Section titled “Apa itu 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:3000Keuntungannya: satu pintu masuk untuk banyak aplikasi, HTTPS cukup dipasang di nginx, aplikasi tidak terekspos langsung, dan nginx bisa menyajikan file statis dengan sangat cepat.
Konfigurasi dasar
Section titled “Konfigurasi dasar”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/.
502 Bad Gateway
Section titled “502 Bad Gateway”Kalau backend mati atau port-nya salah, nginx menjawab 502 Bad Gateway. Langkah diagnosis:
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)"- Jalankan aplikasi backend di container, port 3000.
Petunjuk
docker run -d --name api -p 3000:3000 gstnv/hello-app - Pastikan aplikasinya menjawab langsung di port 3000.
Petunjuk
curl localhost:3000 - Pasang konfigurasi
api.confdisites-available.Petunjuk
sudo cp ~/api.conf /etc/nginx/sites-available/api - Isi port aplikasi yang benar pada
proxy_pass.Petunjuk
sudo sed -i 's/PORT_APLIKASI/3000/' /etc/nginx/sites-available/api - Aktifkan situs
api.Petunjuk
sudo ln -s /etc/nginx/sites-available/api /etc/nginx/sites-enabled/ - Tes lalu reload dalam satu baris.
Petunjuk
sudo nginx -t && sudo systemctl reload nginx - Akses aplikasi lewat nginx.
Petunjuk
curl http://api.local - Matikan backend lalu akses lagi — nginx menjawab 502.
Petunjuk
docker stop api lalu curl -I http://api.local

