Bagian 5 β Deploy Aplikasi Web Β· Langkah 20 dari 38
Nginx sebagai Reverse Proxy
Kenapa aplikasi tidak dilayani langsung di port-nya, tapi lewat 'resepsionis' di port 80.
Konsep reverse proxy dulu, config belakangan
Aplikasi Node-mu listen di port 3000. User internet tidak akan mengetik domainmu.com:3000 β dan kamu tidak mau mengekspos port aplikasi langsung: port 80/443 adalah alamat 'resmi' web, satu-satunya yang boleh dibuka di firewall, dan satu-satunya tempat TLS (HTTPS) ditangani dengan rapi.
nginx (dibaca 'engine-x') berperan sebagai resepsionis gedung: semua tamu datang ke lobi (port 80), nginx yang mengantar ke ruangan yang tepat β /api/* ke aplikasi Node port 3000, / ke app PHP, dan seterusnya. Ini disebut reverse proxy: 'proxy' karena mewakili klien meneruskan permintaan, 'reverse' karena ia di sisi server (kebalikannya: proxy di sisi klien, misalnya untuk menembus sensor).
- Satu port publik untuk banyak aplikasi β dua app di port 3000 & 8000 bisa dilayani bersamaan, bahkan beda domain.
- HTTPS cukup di satu tempat β sertifikat TLS dipasang di nginx, tidak di tiap app.
- Pekerjaan infrastruktur β serve file statis (CSS/JS/gambar) jauh lebih cepat di nginx daripada di app, plus rate limiting, gzip, header keamanan.
- nginx sendiri sangat ringan & stabil β ia tidak ikut mati kalau aplikasimu crash (user melihat error page, bukan connection refused).
Install
$sudo apt install -y nginxdi Ubuntu, paketnya sudah include konfigurasi default yang sehat
$sudo systemctl enable --now nginxservice-nya bernama nginx β kenali polanya dari Bagian 0
$sudo ufw allow 'Nginx Full'buka port 80+443 sekaligus (ufw sudah punya profil bernama ini)
Buka http://IP_VM di browser laptop β halaman 'Welcome to nginx!' = nginx hidup dan firewall tidak menghalangi. Belum ada appmu di sana β itu tugas step berikutnya.
Anatomi konfigurasi (dibaca dulu, dipraktekkan di step stack)
Config nginx di /etc/nginx/ mengikuti pola: satu file 'site' di sites-available diaktifkan lewat symlink ke sites-enabled. File minimal untuk mem-proxy sebuah app:
server {
listen 80;
server_name _; # _ = tangkap semua hostname dulu
location / {
proxy_pass http://127.0.0.1:3000; # kirim ke aplikasi
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}header X-Forwarded-* wajib: memberi tahu app 'IP & protokol asli pengunjung' karena dari sudut pandang app, semua request tampak datang dari nginx (127.0.0.1)
$sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/aktifkan site
$sudo nginx -tWAJIB sebelum reload β cek typo config. nginx tidak akan jalan dengan config rusak
$sudo systemctl reload nginxreload = terapkan config baru tanpa memutus koneksi yang sedang jalan
β Tanda berhasil β centang kalau sudah kamu lihat/buktikan sendiri
Tombol βlanjutβ terbuka setelah semua tercentang β bukan hukuman, tapi jaring pengaman: pastikan step ini benar-benar beres sebelum menumpuk step berikutnya di atasnya.
Lagi bermasalah?
Port 80 sudah dipakai (address already in use)
Cari penghuninya: sudo ss -tlnp | grep :80. Di Ubuntu desktop kadang ada apache2 atau service lain yang terpasang bawaan. Lumpuhkan yang tidak dipakai: sudo systemctl disable --now apache2.
nginx -t sukses tapi reload tidak membawa perubahan
Dua tersangka: symlink sites-enabled belum dibuat (ln -s terlewat), atau browser cache β coba hard refresh (Ctrl+Shift+R) atau buka di private window.