Skip to content
VDS · Situs web dan server web

Reverse proxy: beberapa aplikasi di satu alamat

Cara berbagi satu alamat VDS publik di antara beberapa aplikasi berdasarkan domain dan path, meneruskan header dengan benar, dan tidak merusak WebSocket.

Diperbarui 23 Agustus 2026

Satu mesin memiliki satu alamat IPv4 publik, tetapi biasanya menjalankan beberapa aplikasi. Reverse proxy menerima semua permintaan pada port 80 dan 443 lalu merutekannya ke layanan internal berdasarkan nama domain atau path. Reverse proxy juga memegang satu sertifikat dan log bersama.

Tata letak

Setiap aplikasi mendengarkan pada port lokalnya sendiri dan hanya pada 127.0.0.1:

  • situs frontend — 127.0.0.1:3000;
  • API — 127.0.0.1:8000;
  • dasbor pemantauan — 127.0.0.1:9090.

Hanya Nginx yang terekspos ke luar. Untuk memeriksa apakah suatu aplikasi tidak terekspos secara langsung:

ss -tulpn | grep LISTEN

Baris seperti 0.0.0.0:3000 berarti layanan dapat dijangkau dari internet, melewati proxy dan tanpa enkripsi.

Berdasarkan domain

server {
    listen 80;
    server_name app.example.ru;
    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;
    }
}

server {
    listen 80;
    server_name api.example.ru;
    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;
    }
}

Tanpa X-Forwarded-For, aplikasi melihat setiap permintaan berasal dari 127.0.0.1, dan pembatasan berbasis IP apa pun berhenti berfungsi.

Berdasarkan path

location /api/ {
    proxy_pass http://127.0.0.1:8000/;
}

Garis miring di akhir pada proxy_pass penting di sini: dengan garis miring, prefiks /api dihapus dan aplikasi menerima /users; tanpa garis miring, aplikasi menerima /api/users. Separuh dari semua "404 misterius" pada proxy berasal dari hal ini.

WebSocket dan respons panjang

location /ws/ {
    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_read_timeout 3600s;
}

Tanpa pasangan Upgrade/Connection, koneksi terputus tepat setelah handshake; tanpa timeout yang diperbesar, koneksi terputus setelah satu menit tanpa aktivitas.

Kesalahan umum

GejalaPenyebab
502 Bad GatewayAplikasi tidak berjalan atau mendengarkan pada port yang berbeda
504 Gateway Time-outAplikasi membutuhkan waktu lebih lama untuk merespons daripada proxy_read_timeout
Pengalihan tanpa hentiAplikasi tidak mengetahui HTTPS — teruskan X-Forwarded-Proto
Unggahan berkas gagalclient_max_body_size terlalu kecil; nilai bawaannya 1 MB
IP yang sama di log aplikasiX-Forwarded-For tidak diteruskan

Selanjutnya: beberapa situs, sertifikat, Caddy dengan HTTPS otomatis.

Satu sertifikat pada proxy mencakup semua aplikasi di belakangnya. Koneksi internal melalui 127.0.0.1 tidak memerlukan enkripsi — koneksi tersebut tidak pernah meninggalkan mesin.