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
| Gejala | Penyebab |
|---|---|
502 Bad Gateway | Aplikasi tidak berjalan atau mendengarkan pada port yang berbeda |
504 Gateway Time-out | Aplikasi membutuhkan waktu lebih lama untuk merespons daripada proxy_read_timeout |
| Pengalihan tanpa henti | Aplikasi tidak mengetahui HTTPS — teruskan X-Forwarded-Proto |
| Unggahan berkas gagal | client_max_body_size terlalu kecil; nilai bawaannya 1 MB |
| IP yang sama di log aplikasi | X-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.1tidak memerlukan enkripsi — koneksi tersebut tidak pernah meninggalkan mesin.