---
title: "Nginx Reverse Proxy: Panduan Setup untuk Aplikasi Node.js"
url: "https://helipod.io/blog/nginx-reverse-proxy"
date: "2026-10-06"
updated: "2026-10-06"
author: "Tim Helipod"
tags: ["nginx reverse proxy", "nginx", "reverse proxy", "vps", "ssl"]
excerpt: "Panduan nginx reverse proxy: pengertian, beda dengan forward proxy, contoh config untuk Node.js port 3000, WebSocket, HTTPS certbot, dan solusi error 502."
---

# Nginx Reverse Proxy: Panduan Setup untuk Aplikasi Node.js

**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](/blog/cara-akses-vps-linux) dan [Cloudflare Tunnel adalah](/blog/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:

```bash
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`:

```nginx
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:

```bash
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:

```nginx
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:

```nginx
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:

```bash
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:

```bash
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](/vps-murah) 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](/blog/custom-domain-di-helipod), dan kalau tetap ketemu 502 di sana, ada [panduan troubleshooting error 502](/blog/troubleshooting-error-502-helipod).

---

## 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](/vps-murah), bayar dalam Rupiah lewat QRIS atau virtual account, lalu ikuti langkah di atas.
