Kembali ke Panduan Deploy

Domain sendiri — reverse proxy, ada gambar tiap langkah

Hubungkan domain ke aplikasimu dengan Nginx

Aplikasimu jalan di server tapi cuma bisa dibuka lewat IP:3000 yang jelek dan susah diingat? Di panduan ini kamu akan memasang Nginx sebagai reverse proxy — penjaga pintu yang menerima tamu di app.domainku.com lalu mengantar mereka diam-diam ke aplikasi di port 3000. Dijelaskan dari nol, pelan-pelan, sampai website tampil di domainmu.

Domain rapi

Akses lewat nama domain, bukan IP:port yang sulit diingat.

Satu pintu

Banyak aplikasi bisa berbagi satu server lewat subdomain.

Siap HTTPS

Setelah ini, gembok HTTPS gratis tinggal sekali perintah.

Yang diasumsikan. Kamu sudah punya VPS dan sebuah aplikasi yang berjalan di sana di port lokal (mis. blog/bot Next.js di http://127.0.0.1:3000). Kalau belum, ikuti dulu panduan Docker. Kamu juga perlu sebuah domain (mis. dari Niagahoster, Domainesia, atau Cloudflare).
1
Pahami dulu

Apa itu reverse proxy?

Bayangkan aplikasimu adalah dapur restoran yang sibuk di belakang — alamatnya 127.0.0.1:3000, hanya orang dalam yang tahu. Tamu (pengunjung internet) tidak boleh masuk ke dapur langsung. Mereka datang ke pintu depan yang rapi: app.domainku.com.

Nginx adalah pelayan di pintu depan itu. Ia menerima tamu di domain, lalu meneruskan pesanan ke dapur di port 3000, dan membawa hidangan kembali ke tamu. Inilah yang disebut reverse proxy: satu pintu publik yang cantik di depan, aplikasi tersembunyi aman di belakang.

Alur permintaan: dari pengunjung sampai aplikasi
Pengunjungapp.domainku.com
Nginx (port 80)reverse proxy
Aplikasimu127.0.0.1:3000
2
Checklist

Yang perlu kamu siapkan

Tiga hal saja:

  • VPS dengan akses sudo (Ubuntu/Debian) dan aplikasi yang sudah jalan di port lokal, mis. :3000.
  • Sebuah domain yang kamu miliki (mis. domainku.com).
  • Akses ke panel DNS domain itu (di tempat kamu beli domain, atau di Cloudflare).
3
Sekali pasang

Pasang Nginx di server

Masuk ke server lewat SSH, lalu pasang Nginx. Perintah di bawah juga langsung menyalakannya dan membuatnya otomatis hidup tiap server reboot:

# DI SERVER — pasang Nginx
sudo apt update
sudo apt install -y nginx
 
# pastikan Nginx hidup
sudo systemctl enable --now nginx
sudo systemctl status nginx --no-pager

Untuk memastikan, buka http://IP-VPS-kamu di browser. Kalau muncul halaman "Welcome to nginx!", berarti Nginx sudah hidup dan siap diatur:

deploy@server — cek status Nginx
deploy@server:~$ sudo systemctl status nginx --no-pager● nginx.service - A high performance web server   Active: active (running)# Nginx hidup ✅
4
Penting

Arahkan domain ke server (DNS)

Sekarang kita beri tahu internet bahwa app.domainku.com harus menuju ke IP VPS-mu. Buka panel DNS domain (di tempat beli domain atau di Cloudflare), lalu tambahkan satu A record:

KolomIsiKeterangan
TypeAJenis record — arahkan ke alamat IPv4
NameappSubdomain (hasilnya app.domainku.com)
Value203.0.113.10IP publik VPS kamu
TTLAutoBiarkan default

Setelah disimpan, DNS butuh beberapa menit untuk menyebar. Cek dari laptop apakah domain sudah menunjuk ke IP yang benar:

kamu@laptop — cek DNS
kamu@laptop:~$ dig app.domainku.com +short203.0.113.10# muncul IP VPS = DNS sudah benar ✅
Kalau kamu memakai Cloudflare, untuk langkah awal set dulu kolom Proxy status ke DNS only(awan abu-abu). Setelah HTTPS dari Let's Encrypt aktif, baru boleh dinyalakan (awan oranye).
5
Inti

Tulis konfigurasi reverse proxy

Setiap situs di Nginx punya satu file konfigurasi di folder /etc/nginx/sites-available/. Buat file baru sesuai nama domainmu:

deploy@server — buka editor
deploy@server:~$ sudo nano /etc/nginx/sites-available/app.domainku.com

Isi file tersebut dengan konfigurasi ini:

GNU nano 7.2/etc/nginx/sites-available/app.domainku.com
1server {2    listen 80;3    server_name app.domainku.com;4 5    location / {6        proxy_pass http://127.0.0.1:3000;7        proxy_http_version 1.1;8        proxy_set_header Upgrade $http_upgrade;9        proxy_set_header Connection 'upgrade';10        proxy_set_header Host $host;11        proxy_set_header X-Real-IP $remote_addr;12        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;13        proxy_set_header X-Forwarded-Proto $scheme;14        proxy_cache_bypass $http_upgrade;15    }16}
^O Write Out^X Exit^W Where Is^K Cut

Teks lengkap yang bisa kamu salin (ganti app.domainku.com dan port 3000 sesuai punyamu):

# /etc/nginx/sites-available/app.domainku.com
server {
    listen 80;
    server_name app.domainku.com;
 
    location / {
        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;
        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;
        proxy_cache_bypass $http_upgrade;
    }
}
Baris penting: server_name adalah domain yang dilayani, dan proxy_pass adalah alamat aplikasimu di belakang. Baris Upgrade/Connection diperlukan agar fitur real-time (WebSocket) tetap jalan.
6
Hampir jadi

Aktifkan situs & tes konfigurasi

File di sites-availablebelum aktif sampai kita "menyalakannya" dengan membuat symlink ke sites-enabled. Selalu jalankan nginx -t dulu untuk memastikan tidak ada salah ketik sebelum reload:

# Aktifkan situs: bikin symlink ke folder sites-enabled
sudo ln -s /etc/nginx/sites-available/app.domainku.com \
  /etc/nginx/sites-enabled/
 
# Tes apakah konfigurasi tidak ada salah ketik
sudo nginx -t
 
# Kalau "syntax is ok" -> muat ulang Nginx
sudo systemctl reload nginx
deploy@server — hasil tes config
deploy@server:~$ sudo nginx -tnginx: configuration file /etc/nginx/nginx.conf test is successfuldeploy@server:~$ sudo systemctl reload nginx# situs aktif tanpa downtime ✅
Masih melihat halaman "Welcome to nginx!"? Itu config bawaan yang menutupi situsmu. Matikan dengan sudo rm /etc/nginx/sites-enabled/default lalu sudo systemctl reload nginx.
7
Saat yang ditunggu

Buka di browser

Buka http://app.domainku.com di browser. Aplikasimu kini tampil lewat domain sendiri — IP dan port yang jelek sudah tersembunyi rapi di belakang Nginx:

http://app.domainku.com
Koneksi aman — HTTPS aktif

Blog berbasis markdown

Tulis di Markdown. Push ke GitHub. Deploy di VPS milikmu sendiri.

Menyiapkan VPS pertama kamu

Sebuah catatan singkat tentang menjalankan blog kamu sendiri…

Menulis dengan Markdown

Sebuah catatan singkat tentang menjalankan blog kamu sendiri…

Deployment berhasil
Perhatikan masih http:// (belum ada gembok). Itu wajar — langkah berikutnya kita pasang HTTPS gratisdari Let's Encrypt supaya jadi https:// yang aman.
8
Anti-stuck

Masalah umum & cara mengatasinya

Kalau ada yang belum jalan, cek tabel ini dulu sebelum panik:

GejalaSebabSolusi
502 Bad GatewayAplikasi di port 3000 belum jalan, atau salah port.Pastikan app hidup: curl http://127.0.0.1:3000 di server harus membalas.
Tetap muncul "Welcome to nginx"Config default masih aktif & menimpa situsmu.Hapus default: sudo rm /etc/nginx/sites-enabled/default lalu reload.
Domain belum terbukaDNS belum menyebar atau salah isi IP.Cek dengan: dig app.domainku.com +short — harus muncul IP VPS.
nginx -t errorAda salah ketik di file config (titik koma/kurung).Baca pesan error-nya, ia menyebut nomor baris yang bermasalah.

Langkah berikutnya

Domain sudah jalan lewat http://. Sekarang amankan dengan gembok HTTPS gratis — prosesnya tinggal satu perintah karena Nginx sudah siap.

Lanjutan: pasang SSL/HTTPS gratis dengan Let's Encrypt →

Ubah http:// jadi https:// bergembok, gratis, dan perpanjang otomatis. Lengkap dengan tombol salin.