Reverse proxy adalah fitur Nginx yang memungkinkan server menerima request dari client, kemudian meneruskan request tersebut ke satu atau beberapa server backend. Dengan reverse proxy, Nginx bisa menjadi gateway untuk aplikasi, meningkatkan keamanan, kinerja, dan fleksibilitas server.
Contents
Apa itu Reverse Proxy?
Reverse proxy berbeda dari forward proxy. Forward proxy digunakan client untuk mengakses server, sedangkan reverse proxy digunakan server untuk menerima request dari client.
Manfaat reverse proxy:
- Menyembunyikan alamat backend server
- Load balancing untuk distribusi traffic
- SSL termination untuk HTTPS
- Caching konten statis untuk performa lebih cepat
Ilustrasi:
Client --> Nginx (Reverse Proxy) --> Backend 1
--> Backend 2
Konfigurasi proxy_pass
proxy_pass meneruskan request ke backend. Contoh konfigurasi dasar:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:3000;
}
}
Semua request ke / diteruskan ke backend di 127.0.0.1:3000.
Proxy Headers
Untuk backend mengetahui informasi client asli, gunakan proxy_set_header:
location / {
proxy_pass http://127.0.0.1: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;
}
Fungsi header:
Host: nama domain asliX-Real-IP: IP clientX-Forwarded-For: daftar IP client melewati proxyX-Forwarded-Proto: protokol HTTP/HTTPS
Tips: selalu sertakan header ini agar backend bisa log IP asli dan mengatur redirect atau HTTPS dengan benar.
Load Balancing Sederhana
Nginx dapat mendistribusikan request ke beberapa backend menggunakan upstream:
upstream myapp_backend {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://myapp_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Nginx menggunakan round-robin secara default.
Metode Load Balancing Lain
- Least Connections
Request diteruskan ke server dengan koneksi aktif paling sedikit:
upstream myapp_backend {
least_conn;
server 127.0.0.1:3000;
server 127.0.0.1:3001;
}
- IP Hash
Request dari IP tertentu selalu diarahkan ke server yang sama:
upstream myapp_backend {
ip_hash;
server 127.0.0.1:3000;
server 127.0.0.1:3001;
}
least_conn cocok untuk backend dengan load tidak merata, sedangkan ip_hash cocok untuk aplikasi yang memerlukan session persistence.
Contoh Konfigurasi Lengkap Reverse Proxy
upstream myapp_backend {
least_conn;
server 127.0.0.1:3000;
server 127.0.0.1:3001;
}
server {
listen 80;
server_name example.com www.example.com;
location / {
proxy_pass http://myapp_backend;
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;
proxy_connect_timeout 5s;
proxy_read_timeout 30s;
proxy_send_timeout 10s;
}
error_page 502 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Penjelasan tambahan:
- Timeout mengatur batas koneksi dan response backend
- Error page 502 untuk backend tidak responsif
upstreammendukung penambahan server baru tanpa mengubah server block utama
Best Practice Reverse Proxy
- Selalu sertakan header client agar backend mengetahui IP dan protokol
- Gunakan load balancing untuk trafik tinggi
- Pisahkan reverse proxy dan backend di server yang berbeda
- Atur timeout dan error page untuk pengalaman pengguna lebih baik
- Gunakan upstream block agar mudah menambah atau menghapus backend
Dengan konfigurasi ini, Nginx dapat bertindak sebagai reverse proxy, mendistribusikan trafik, dan menjaga backend tetap aman serta stabil.