β–šServer Journey

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.

80/443proxy_passlokasi /forumBrowser(tanpa port)nginx :80resepsionisapp Node :3000app lain :8000
Reverse proxy nginx: satu pintu depan (80/443), meneruskan ke banyak pintu belakang (3000, 8000, socket php-fpm)

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 nginx

di Ubuntu, paketnya sudah include konfigurasi default yang sehat

$sudo systemctl enable --now nginx

service-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:

/etc/nginx/sites-available/myapp
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 -t

WAJIB sebelum reload β€” cek typo config. nginx tidak akan jalan dengan config rusak

$sudo systemctl reload nginx

reload = terapkan config baru tanpa memutus koneksi yang sedang jalan

reload vs restart di nginx: reload membangun worker baru dengan config baru sambil menyelesaikan request lama β€” nyaris tanpa kilatan. Kebiasaan: nginx -t dulu, reload kedua.

βœ“ 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.

← Istilah: systemd vs systemctl vs ServiceπŸ”’ Lanjut (checklist dulu)