Taufik Mulyana
Taufik Mulyana
Linux System Administrator, Interested in Linux, Cloud, Containers
May 5, 2018 6 min read

Load Balancing dengan Nginx

load balancing dengan nginx

nginx ini sangat menarik menurut saya, selain dapat digunakan sebagai web server nginx juga dapat digunakan sebagai reverse proxy, caching, dan juga load balancing, kali ini saya akan membahas bagaimana cara membuat nginx sebagai loadbalancer,

Apa itu Load Balancing ?

load balancing merupakan sebuah mekanisme untuk mendistribusikan beban atau trafik ke setiap server yang ada untuk meningkatkan performa, skalibilitas, dan reliabilitas pada aplikasi.

Metode Load Balancing

berikut beberapa metode load balancing yang didukung oleh nginx

  • round-robin – setiap request akan didistribusikan ke setiap server, dan setiap server memiliki beban yang sama
  • least-connected – request ke server di tujukan ke server yang memiliki paling sedikit koneksi aktif
  • ip-hash – tidak seperti round-robin dan least-connected setiap request kemungkinan akan diarahkan pada server yang berbeda, pada ip-hash setiap request dari klien dipastikan di arahkan ke server yang sama berdasarkan alamat ip,
    contoh: pengguna dengan ip 192.168.1.23 saat pertama me-request di arahkan ke Server A dan akan terus di arahkan ke Server A tidak akan diarahkan ke Server B terkecuali ketika Server A down, tidak seperti pada metode round-robin dan least-connected, yang kemungkinan di arahkan ke server yang berbeda

Konfigurasi Load Balancing

konfigurasi paling sederhana bisa dilihat seperti dibawah

http {
    upstream backend {
        server 192.168.1.1:80; #backend1
        server 192.168.1.2:80; #backend2
        server 192.168.1.3:80; #backend3
    }

    server {
        listen 80;
        server_name nothinux.id; 
        access_log /var/log/nginx/access_log; 
        error_log /var/log/nginx/error_log;

        location / {
            proxy_pass http://backend;
        }
    }
}

pada konfigurasi di atas saya membuat sebuah upstream yang bernama backend yang berisi 3 server (backend1-3) yang ada dibelakang loadbalancer yang nantinya akan menerima setiap request dari load balancer, jika metode load balancing tidak di set seperti di atas secara default nginx akan menggunakan metode round-robin, jika anda ingin menggunakan metode lain, konfigurasinya akan terlihat seperti berikut

upstream backend {
    least_conn;
    server 192.168.1.1:80; #backend1
    server 192.168.1.2:80; #backend2
    server 192.168.1.3:80; #backend3
}

konfigurasi di atas menunjukan kita menggunakan metode least-connected jika anda ingin menggunakan ip-hash anda tinggal mengganti least-connected dengan ip-hash

Weighted Load Balancing

dengan mengatur weight memungkinkan dapat mempengaruhi algoritma load balancing di atas, pada contoh di atas kita belum menerapkan weight yang artinya semua server diperlakukan sama sesuai metode load balancing yang digunakan

berikut contoh penggunaan weight

upstream backend {
    server 192.168.1.1:80 weight=3; #backend1
    server 192.168.1.2:80; #backend2
    server 192.168.1.3:80; #backend3
}

pada konfigurasi di atas, jika terdapat 5 request, request tersebut akan didistribusikan ke server backend1 3 request dan sisanya akan dibagi ke server selanjutnya, 1 request ke backend2 dan 1 request terakhir ke backend3,

seperti yang telah disebutkan sebelumnya walaupun kita menggunakan round-robin yang seharusnya setiap server memiliki beban yang sama, ketika kita menggunakan weight pendistribusian akan di sesuaikan dengan konfigurasi pada weight

Health Check

Nginx memantau setiap transaksi yang terjadi, dan jika ada transaksi yang gagal nginx akan mencoba melakukan transaksi lagi, jika transaksi tetap tidak bisa dilakukan nginx akan menandai server tersebut sebagai tidak aktif atau tidak tersedia dan menghentikan sementara setiap request ke server tersebut, dan akan dilanjutkan ketika server tersebut ditandai aktif kembali

kondisi dimana server ditandai sebagai tidak tersedia di definisikan pada setiap server upstream pada blok upstream

  • fail_timeout untuk menetapkan waktu untuk setiap request yang gagal sebelum server ditandai sebagai tidak tersedia, secara default 10 detik
  • max_fails – untuk menetapkan jumlah request gagal yang harus terjadi pada periode fail_timeout sebelum server ditandai sebagai tidak tersedia, secara default 1 kali

pada contoh dibawah, jika nginx gagal mengirim request ke server dan tidak menerima respon 3 kali dalam 30 detik, nginx akan menandai server tidak tersedia selama 30 detik

upstream backend {
   server 192.168.1.1:80 max_fails=3 fail_timeout=30s; #backend1
   server 192.168.1.2:80; #backend2
   server 192.168.1.3:80; #backend3
}

Studi Kasus

laod balancing with nginx

sesuai gambar diatas saya memiliki 3 server backend dan di depannya terdapat 1 loadbalancer, nantinya pengguna yang mengakses dan melakukan request akan melalui loadbalancer terlebih dahulu dan selanjutnya loadbalancer akan meneruskannya ke server backend.

Konfigurasi Server Backend

tambahkan konfigurasi virtualhost untuk backend1, saya meletakannya di direktori conf.d

$ sudo vim /etc/nginx/conf.d/nothinux.conf

server {
    listen 80;
    server_name nothinux.id;
    access_log /var/log/nginx/access_log;
    error_log /var/log/nginx/error_log;

    root /var/www/whitehat.id/public_html;
    index index.html

    location / {
        try_files $uri $uri/ =404;
    }
}

lalu tambahkan berkas html di direktori /var/www/nothinux.id/public_html

$ sudo vim /var/www/whitehat.id/public_html/index.html

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to backend1 !</title>
  </head>
<body>
  <h1>Welcome to backend1 !</h1>
</body>
</html>

lakukan step diatas untuk backend2 dan juga backend3, dan sesuaikan berkas index.html ubah backend1 sesuai backend yang bersangkutan, hal ini dilakukan agar saat kita mencoba mengakses kita tahu diarahkan ke server mana

jalankan ulang nginx

$ sudo nginx -s reload

Konfigurasi Load Balancer

tambahkan konfigurasi loadbalancer pada direktori conf.d

$ sudo vim /etc/nginx/conf.d/loadbalancer.conf

upstream backend {
    server 192.168.1.1:80; #backend1
    server 192.168.1.2:80; #backend2
    server 192.168.1.3:80; #backend3
}

server {
    listen 80;
    server_name whitehat.id;
    access_log /var/log/nginx/access_log;
    error_log /var/log/nginx/error_log;

    location / {
        proxy_pass http://backend;
    }
}

simpan konfigurasi dan jalankan ulang nginx

$ sudo nginx -s reload

Tes

selanjutnya coba akses domain atau ip load balancer, cek anda diarahkan ke server mana, lalu coba reload anda akan di arahkan ke server selanjutnya, dan seterusnya

sekian untuk kali ini, semoga bisa bermanfaat