Panduan Awal Membuat Reverse Proxy dengan Nginx
Arsitektur Kontrol Trafik: Pengalihan Port Internal, Manajemen Lokasi Berbasis Path, Terminasi SSL, dan Optimasi Header Proxy
Saat mengelola server VPS produksi, Anda sering kali harus menjalankan beberapa aplikasi yang dibangun dengan teknologi berbeda secara bersamaan—misalnya API berbasis Node.js di port 3000, aplikasi Python Django di port 8080, dan situs WordPress di pemroses PHP-FPM standar. Mengelola sertifikat SSL, aturan dinding api (*firewall*), serta konfigurasi keamanan terpisah untuk setiap port tersebut tentu akan menjadi mimpi buruk manajemen infrastruktur.
Solusi terbaik untuk menyederhanakan arsitektur ini adalah dengan menerapkan Reverse Proxy menggunakan Nginx. Bertindak sebagai resepsionis atau gerbang tunggal di baris terdepan server, Reverse Proxy menerima seluruh trafik publik dari port standar HTTP (80) / HTTPS (443), kemudian mendistribusikannya secara cerdas ke aplikasi internal yang sesuai berdasarkan nama domain atau jalur sub-direktori (*path*). Pendekatan ini menyembunyikan detail port internal dari publik, mengonsolidasikan manajemen SSL di satu tempat, serta mendongkrak efisiensi server secara masif.
1. Menyusun Konfigurasi Dasar Reverse Proxy Nginx
Buat sebuah file configuration server block baru untuk mengarahkan trafik nama domain publik Anda menuju port internal aplikasi Node.js/Python (port 3000):
sudo nano /etc/nginx/sites-available/my-reverse-proxy
# Tempel struktur blok proxy HTTP berikut:
server {
listen 80;
server_name suryassh.net www.suryassh.net;
location / {
# Instruksi utama melemparkan trafik ke port aplikasi internal
proxy_pass http://localhost:3000;
# Meneruskan header informasi asli pengunjung agar tidak tersamarkan oleh IP server
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;
}
}
Aktifkan konfigurasi tersebut dengan membuat tautan simbolik, uji validitas sintaks kode, lalu muat ulang Nginx:
sudo ln -s /etc/nginx/sites-available/my-reverse-proxy /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
2. Konfigurasi Produksi dengan Dinding Pengaman SSL HTTPS
Teknik **SSL Termination** berarti Nginx akan menangani proses dekripsi jabat tangan HTTPS di gardu depan, sehingga aplikasi backend Anda tidak perlu dibebani oleh komputasi enkripsi SSL. Klaim sertifikat via Certbot Let's Encrypt:
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d suryassh.net -d www.suryassh.net
Pilih opsi otomatisasi pengalihan rute (Redirect HTTP to HTTPS). Hasil file konfigurasi Server Block Anda di /etc/nginx/sites-available/my-reverse-proxy otomatis akan dimodifikasi oleh Certbot menjadi standar produksi yang aman berikut:
server {
listen 443 ssl http2;
server_name suryassh.net;
ssl_certificate /etc/letsencrypt/live/suryassh.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/suryassh.net/privkey.pem;
# Pengetatan Security Headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
location / {
proxy_pass http://localhost:3000;
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;
# Mengatur batas ambang batas waktu tunggu (timeouts) eksekusi proxy
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
3. Manajemen Multi-Aplikasi Berbasis Jalur Direktori (Path-Based Routing)
Salah satu kelebihan utama Reverse Proxy adalah kemampuannya memecah satu nama domain tunggal untuk melayani beberapa aplikasi backend sekaligus berdasarkan string pola URL (*path*). Perhatikan contoh pembagian rute lokasi berikut:
# Contoh rute multi-aplikasi di dalam blok server HTTPS Anda:
# 1. Seluruh trafik berawalan jalur /api/ dilempar ke Node.js aplikasi (Port 3000)
location /api/ {
proxy_pass http://localhost:3000/;
proxy_set_header Host $host;
include proxy_params;
}
# 2. Seluruh trafik berawalan jalur /admin/ dilempar ke aplikasi Python (Port 8080)
location /admin/ {
proxy_pass http://localhost:8080/;
proxy_set_header Host $host;
include proxy_params;
}
# 3. File aset statis murni dirender langsung oleh Nginx tanpa membebani backend
location /static/ {
alias /var/www/suryassh.net/static/;
expires 1y;
add_header Cache-Control "public, immutable";
}
⚠️ Perhatikan Tanda Garis Miring (/): Menyertakan tanda / di akhir alamat target perintah proxy_pass (misal: http://localhost:3000/) akan memotong string path asal. Jadi, request 'suryassh.net/api/users' akan diterima backend secara bersih sebagai '/users'.
4. Mengaktifkan Dukungan Protokol WebSocket (SSH WebSocket / V2Ray)
Secara default, Reverse Proxy Nginx akan memutuskan koneksi persisten non-HTTP. Jika Anda menggunakan Nginx sebagai perantara untuk meneruskan trafik protokol tunneling bertipe **SSH WebSocket, Trojan, atau V2Ray WS**, Anda wajib menyuntikkan instruksi peningkatan header (*Upgrade Headers*) agar jabat tangan WebSocket tetap terjaga terbuka:
location /zearws {
proxy_pass http://127.0.0.1:8888; # Mengarah ke port biner v2ray/ssh-ws core lokal
# Mengaktifkan kuncian fitur jabat tangan WebSocket Upgrade
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;
# Mengunci durasi keepalive agar koneksi terowongan tidak mudah putus (Disconnect)
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
5. Akselerasi Kecepatan Balasan Menggunakan Proxy Caching
Untuk mereduksi konsumsi CPU backend, Anda bisa memerintahkan Nginx menyimpan salinan respon halaman statis di dalam disk memori server. Buka file konfigurasi inti /etc/nginx/nginx.conf dan letakkan aturan alokasi cache ini di dalam blok **http { ... }**:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=proxy_cache_zone:10m max_size=5g inactive=60m use_temp_path=off;
Selanjutnya, panggil kuncian zona cache tersebut di dalam berkas lokasi *Server Block* Anda:
location / {
proxy_cache proxy_cache_zone;
proxy_cache_valid 200 302 15m; # Simpan respon sukses 200 selama 15 menit
proxy_cache_valid 404 1m;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_pass http://localhost:3000;
}
Protokol Diagnosis Kendala Galat "502 Bad Gateway" pada Reverse Proxy
Kemunculan status kode galat **502 Bad Gateway** pada browser merupakan kendala paling populer dalam implementasi proxy. Hal tersebut menandakan Nginx gagal terhubung dengan aplikasi backend tujuan. Selesaikan kendala tersebut lewat 3 runtunan audit berikut:
- Validasi Status Operasional Aplikasi Backend: Pastikan aplikasi Node.js atau Python Anda benar-benar sedang menyala aktif mendengarkan port internal. Lakukan pengujian jabat tangan lokal via perintah terminal CLI:
curl http://localhost:3000. Jika mengembalikan status error menolak koneksi, artinya aplikasi backend Anda yang mati, bukan Nginx yang bermasalah. - Periksa Sinkronisasi Nomor Port Tujuan: Periksa kembali baris teks instruksi
proxy_passpada berkas konfigurasi Nginx Anda. Ketidakcocokan penulisan nomor port target (misal aplikasi berjalan di port 3001 tetapi skrip tertulis 3000) otomatis akan memicu kegagalan interkoneksi biner. - Sisir Berkas Log Kerusakan Nginx secara Real-Time: Jangan menebak-nebak pemicu kerusakan di dalam ruang gelap. Selalu buka dan sisir baris teks log pemicu error yang direkam sistem lewat perintah pemantauan aktif terminal:
sudo tail -f /var/log/nginx/error.loguntuk mendapatkan string rincian penyebab galat secara gamblang.
