BIAYABLOG

Nginx Reverse Proxy: Panduan Setup untuk Aplikasi Node.js

Tim Helipod
Diterbitkan 6 menit baca

Nginx reverse proxy adalah setup paling umum untuk menjalankan aplikasi web di VPS. Aplikasi Node.js, Python, atau Go kamu berjalan di port internal seperti 3000 atau 8000, sementara nginx berdiri di depan, menerima request di port 80 dan 443, lalu meneruskannya ke aplikasi.

Hasilnya: satu IP publik bisa melayani banyak aplikasi, HTTPS diurus di satu tempat, dan aplikasi kamu tidak perlu terekspos langsung ke internet.

Artikel ini membahas pengertian reverse proxy, contoh config yang siap pakai, cara memasang HTTPS dengan Let's Encrypt, dan cara mengatasi error yang paling sering muncul.

Baca juga: Cara Akses VPS Linux dan Cloudflare Tunnel adalah


Reverse Proxy vs Forward Proxy#

Keduanya sama-sama perantara, tapi melindungi pihak yang berbeda.

Aspek Forward proxy Reverse proxy
Berdiri di depan Klien (pengguna) Server (aplikasi)
Contoh Proxy kantor, VPN Nginx, HAProxy, Caddy
Yang disembunyikan Identitas klien Server di belakangnya
Dipasang oleh Pengguna atau admin jaringan Pemilik aplikasi

Dengan forward proxy, server tujuan melihat IP proxy, bukan IP pengguna. Dengan reverse proxy, pengguna hanya melihat nginx dan tidak tahu aplikasi sebenarnya jalan di port berapa.


Kenapa Pakai Nginx Reverse Proxy?#

  • Satu port publik untuk banyak aplikasi. Nginx memilih aplikasi tujuan berdasarkan nama domain (server_name).
  • TLS termination. Sertifikat HTTPS dipasang di nginx, aplikasi cukup bicara HTTP biasa di localhost.
  • Load balancing. Nginx bisa membagi traffic ke beberapa instance aplikasi lewat blok upstream.
  • Caching dan file statis. Nginx menyajikan file statis dengan efisien dan bisa men-cache respons.
  • Header dan keamanan. Menambah header, membatasi ukuran upload, atau rate limiting di satu tempat.

Contoh Config Nginx Reverse Proxy untuk Node.js#

Install nginx di Ubuntu atau Debian:

sudo apt update
sudo apt install -y nginx

Pastikan aplikasi Node.js kamu berjalan di 127.0.0.1:3000 (pakai pm2 atau systemd agar tetap hidup). Lalu buat file /etc/nginx/sites-available/app.conf:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 80;
    server_name app.domainkamu.com;

    client_max_body_size 20m;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;

        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;

        # WebSocket
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        proxy_read_timeout 60s;
    }
}

Fungsi tiap header:

  • Host meneruskan nama domain asli, penting untuk aplikasi yang membuat URL absolut.
  • X-Real-IP dan X-Forwarded-For membawa IP asli pengunjung. Di Express, aktifkan app.set('trust proxy', 1) agar req.ip membacanya.
  • X-Forwarded-Proto memberi tahu aplikasi bahwa request aslinya HTTPS.
  • Upgrade dan Connection dibutuhkan agar WebSocket (misalnya Socket.IO) bisa naik dari HTTP.

Aktifkan dan uji:

sudo ln -s /etc/nginx/sites-available/app.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Biasakan selalu menjalankan nginx -t sebelum reload. Kalau ada typo, nginx menolak config baru dan versi lama tetap berjalan.


Banyak Aplikasi dalam Satu Server#

Cukup buat satu blok server per domain:

server {
    listen 80;
    server_name api.domainkamu.com;
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

server {
    listen 80;
    server_name blog.domainkamu.com;
    root /var/www/blog;
    index index.html;
}

Untuk load balancing ke beberapa instance:

upstream app_backend {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
}
# lalu: proxy_pass http://app_backend;

Pasang HTTPS dengan Certbot#

Pastikan record A domain sudah mengarah ke IP VPS dan port 80 serta 443 terbuka di firewall. Lalu:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d app.domainkamu.com

Certbot mengambil sertifikat Let's Encrypt, menambahkan listen 443 ssl ke config, dan bisa membuat redirect dari HTTP ke HTTPS. Sertifikat diperpanjang otomatis oleh timer systemd. Cek dengan:

sudo certbot renew --dry-run

Error Umum dan Solusinya#

Error Penyebab umum Solusi
502 Bad Gateway Aplikasi mati, port salah, atau aplikasi crash Cek ss -tlnp, log aplikasi, dan /var/log/nginx/error.log
504 Gateway Timeout Aplikasi terlalu lama merespons Optimalkan query atau naikkan proxy_read_timeout
413 Request Entity Too Large Upload melebihi batas default 1 MB Set client_max_body_size 20m;
WebSocket putus Header Upgrade tidak diteruskan Tambahkan Upgrade dan Connection serta proxy_http_version 1.1
Redirect loop Aplikasi tidak tahu request aslinya HTTPS Teruskan X-Forwarded-Proto dan atur trust proxy

Untuk 502, langkah tercepat: jalankan curl -I http://127.0.0.1:3000 dari dalam VPS. Kalau perintah itu gagal, masalahnya di aplikasi, bukan di nginx. Perhatikan juga apakah aplikasi listen di 127.0.0.1 atau port lain dari yang kamu tulis di proxy_pass.


Jalankan di VPS, atau Biarkan Platform yang Mengurus#

Nginx reverse proxy paling masuk akal kalau kamu mengelola server sendiri. Di VPS murah Helipod kamu dapat akses root dengan Ubuntu atau Debian, jadi semua langkah di atas bisa langsung dipakai. Paket VPS S di Jakarta dan Singapore (2 vCPU, 2 GB RAM, 40 GB) mulai Rp 64.900 per bulan. Harga bisa berubah, cek halaman harga untuk angka terbaru.

Kalau kamu tidak ingin mengurus nginx, certbot, dan perpanjangan sertifikat, deploy aplikasinya di platform aplikasi Helipod. Routing dan SSL sudah ditangani: kamu cukup menambahkan custom domain dan sertifikat SSL dipasang otomatis. Aplikasi hanya perlu listen di satu port. Lihat custom domain di Helipod, dan kalau tetap ketemu 502 di sana, ada panduan troubleshooting error 502.


FAQ#

Apa itu nginx reverse proxy?#

Nginx yang berdiri di depan aplikasi, menerima request dari internet, lalu meneruskannya ke aplikasi di port internal. Pengunjung hanya berinteraksi dengan nginx.

Apakah reverse proxy wajib untuk aplikasi Node.js?#

Tidak wajib, tapi sangat disarankan di VPS. Tanpa reverse proxy, kamu harus mengurus HTTPS dan port 80/443 langsung di aplikasi, dan hanya satu aplikasi bisa memakai port itu.

Kenapa muncul 502 Bad Gateway setelah setup?#

Hampir selalu karena nginx tidak bisa menghubungi aplikasi: aplikasi belum jalan, crash, atau port di proxy_pass berbeda. Cek error log nginx dan log aplikasi.

Bedanya reload dan restart nginx?#

reload memuat config baru tanpa memutus koneksi yang sedang berjalan. restart mematikan lalu menyalakan ulang proses. Untuk perubahan config, pakai reload setelah nginx -t sukses.

Apakah perlu nginx kalau deploy di Helipod?#

Tidak. Di platform aplikasi Helipod, routing domain dan SSL otomatis sudah disediakan. Nginx sendiri hanya perlu kalau kamu memakai VPS.


Siap memasang nginx reverse proxy di server sendiri? Pilih paket di VPS murah Helipod, bayar dalam Rupiah lewat QRIS atau virtual account, lalu ikuti langkah di atas.

Artikel terkait

Lihat semua

Siap coba Helipod?

Deploy aplikasi kamu sekarang. Gratis, tanpa kartu kredit.

Mulai Gratis →
WhatsApp