Bab 6: Reverse Proxy Nginx – Panduan Lengkap untuk Load Balancing dan Proxy Headers

Bab 6: Reverse Proxy Nginx – Panduan Lengkap untuk Load Balancing dan Proxy Headers

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.


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 asli
  • X-Real-IP: IP client
  • X-Forwarded-For: daftar IP client melewati proxy
  • X-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

  1. 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;
}
  1. 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
  • upstream mendukung 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.