Web Server Load Balancing dan Reverse Proxy dengan NGINX

a. Pengertian
Load Balance merupakan salah satu cara yang dapat digunakan untuk membuat keseimbangan Traffic antar banyak Web Server sesuai dengan yang kita konfigurasikan.

b. Latar Belakang
Konfigurasi ini didasari atas keinginan kami untuk membuat suatu konfigurasi Web Service tanpa adanya gangguan Single Point Failure yang diakibatkan karena salah satu Server mengalami gangguan atau down.

c. Maksud dan Tujuan
Tujuan dari konfigurasi ini adalah untuk membuat Web Server NGINX yang dikonfigurasi sebagai Load Balancer dan Reverse Proxy untuk Web Server-Web Server yang ada dibelakangnya. Reverse Proxy digunakan untuk menscalling penggunaan Web Server yang dari satu menjadi puluhan atau ratusan server.

d. Waktu Pengerjaan
Waktu yang digunakan untuk melakukan konfigurasi ini kurang lebih 10-15 Menit.

e. Alat dan Bahan
– PC
– 1 Server untuk NGINX
– 2 Server untuk Web Server Apache2

f. Langkah Pengerjaan
Disini saya mengasumsikan Ketiga Server diatas sudah diinstall OS nya. Untuk konfigurasi pribadi saya menggunakan Ubuntu Server 16.04 untuk NGINX dan Debian 8.6 untuk Apache2

1. Instalasi Apache2
Pertama kita akan melakukan Instalasi Web Server Apache2 di kedua server yang akan dijadikan Backend Web Server.

~# apt install apache2

2. Konfigurasi Port Apache2
Karena Apache2 tidak melayani Client secara langsung dan untuk alasan keamanan, saya mengganti Port Default Apache2 yaitu dari 80 ke 8080. Kita dapat menggantinya dengan mengedit file /etc/apache2/ports.conf

~# nano /etc/apache2/ports.conf

Kita ganti Listen Port dari 80 ke 8080, kemudian kita Save dan Restart Service Apache2 nya.

~# service apache2 restart

3. Instalasi NGINX
Selanjutnya kita lakukan Instalasi Web Server NGINX pada Server Frontend.

~# apt install nginx

Pastikan ketika selesai install, cobalah untuk mengakses IP atau Domain Server tersebut. Apabila muncul “Welcome to nginx!”, silahkan lanjutkan konfigurasi. Apabila muncul Connection Refuse, Bad Gateway dsb, silahkan untuk memperbaikinya terlebih dahulu. Cara untuk memperbaiki sayangnya diluar scope dari Artikel ini.

4. Konfigurasi NGINX untuk Load Balancer dan Reverse Proxy
Sebelum melanjutkan, saya akan menjelaskan sedikit mengenai macam-macam Load Balancing yang dapat dilakukan oleh NGINX.
Round Robin : Tipe Load Balancing ini akan mendistribusikan Traffic ke server-server dibelakangnya dengan sama rata. Tipe ini cocok untuk melayani Website dengan tipe statik dikarenakan cara kerjanya yang mendistribusikan Traffic ke Semua Server. Meskipun memungkinkan untuk diaplikasikan pada Website Dinamis namun teman-teman harus melakukan konfigurasi lebih lanjut karena jika tidak maka kalian akan memiliki masalah pada Sesi Aplikasi.

Least Connection : Tipe Load Balancing ini akan mendistribusikan Traffic ke Server yang mempunyai beban load yang rendah. Karakteristik dari Tipe ini sama seperti Round Robin, yaitu cocok untuk Website Statik namun akan bermasalah untuk Website Dinamis apabila tidak ada konfigurasi lanjut.

IP Hash : Tipe Load Balancing ini akan mendistribusikan Traffic berdasarkan IP dari Client. NGINX akan mencocokkan Webserver Backend dengan IP yang dimiliki oleh Client, sehingga apabila seorang Client mendapatkan jawaban dari Server A pada pertama kali, maka request selanjutnya juga akan mendapat jawaban dari Server A dan seterusnya sampai Server tersebut dianggap Down, jika Down maka Client baru akan diarahkan ke Server B dan seterusnya. Karena itu dari ketiga tipe Load Balancing ini, IP Hash adalah tipe yang paling cocok diaplikasikan pada Website Dinamis.

Yap, itu adalah sedikit penjelasan mengenai macam Load Balancing yang ada di NGINX. Untuk membuat konfigurasi Load Balancing dan Reverse Proxy, kita cukup membuat satu file konfigurasi yang dapat diletakkan di /etc/nginx/conf.d/. Isi dari file tersebut kurang lebih adalah seperti ini:

;; Pindah Current Working Directory
~# cd /etc/nginx/conf.d
;; Buat file konfigurasi~/etc/nginx/conf.d# nano loadbalancer.conf

Umumnya, konfigurasi awal untuk Load Balancing dan Reverse Proxy kurang lebih seperti ini:

# Mendaftarkan Server / Grup Server-serverupstream grupserver1 {
server 192.168.101.1:8080;
server 192.168.101.2:8080;
}

server {
# Konfigurasi Port NGINX
listen 80;

location / {

# Konfigurasi Header HOST yang berisi Host yang diminta.
proxy_set_headers HOST $host;
# Konfigurasi Header untuk Server Backend yang berisi Informasi Protokol Client, HTTP atau HTTPS.
proxy_set_header X-Forwarded-Proto $scheme
# Konfigurasi Header yang berisi IP Asli dari Client.
proxy_set_header X-Real-IP $remote_addr;
# Konfigurasi Header yang berisi Server-server yang pernah diakses oleh Client.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Pass Request dari NGINX ke Upstream
proxy_pass http://grupserver1;
}
}

4. Disable Default Site NGINX
Agar tidak tumpang tindih konfigurasinya, maka kita akan mematikan Default Site NGINX dengan menghapus Symbolic Link yang berada di /etc/nginx/sites-enabled.

~# rm /etc/nginx/sites-enabled/default

5. Restart NGINX
Agar konfigurasinya diterapkan NGINX, kita perlu merestart Servicenya dengan cara:

~# service nginx restart

6. Test!
Jika tidak ada Error pada log /var/log/syslog ataupun ketika merestart NGINX, maka seharusnya Load Balancer dan Reverse Proxy NGINX sudah berjalan!

Untuk sedikit Improvisasi:
Mengarahkan Traffic ke Server berdasarkan IP Client
Kita akan mengubah sedikit konfigurasinya menjadi seperti ini:

geo $upstream {
default grupserver1;
10.20.30.0/24 grupserver2;
192.168.10.1/29 grupserver3;
}
upstream grupserver1 {
server 10.0.0.1;
server 10.0.0.2;
server 10.0.0.3;
}
upstream grupserver2 {
server 10.1.1.1;
server 10.1.1.2;
}
upstream grupserver3 {
server 10.2.2.1;
}
server {
…………………….
proxy_pass http://$upstream;
……………………..
}

– Mendistribusikan Traffic berdasarkan Konfigurasi Beban
Kita bisa mengkonfigurasi Server mana yang akan menerima beban yang lebih berat dan lebih ringan dengan menambahkan parameter weight.

upstream grupserver1 {
server 10.0.0.1 weight=15;
server 10.0.0.2 weight=10;
server 10.0.0.3 weight=5;
}

Maksud dari 15,10,dan 5 adalah bahwa Traffic akan disebar ke tiga server tersebut dengan masing-masing server akan menangani sejumlah 15 Request, 10, dan 5 Request.

– Health Check Tweak: Mengatur Max Fail dan Timeout Server
Kita bisa mengaktifkan Health Check pada Server Backend kita untuk mengetahui apakah Server-server tersebut dapat merespon atau tidak. Kita akan menambahkan parameter max_fails dan fail_timeout pada konfigurasi Upstream.

upstream grupserver1 {
server 10.0.0.1 weight=15 max_fails=2 fail_timeout=5s;
server 10.0.0.2 weight=10 max_fails=2 fail_timeout=10s;
server 10.0.0.3 weight=5 max_fails=3 fail_timeout=10s;
}

Max Fail adalah parameter untuk mengindikasikan berapa kali server tersebut diberi kesempatan jika terjadi gagal respon. Dan Max Fail akan dihitung apabila sudah melampaui batas Timeout sejak Server tersebut gagal merespon. Apabila Max Fail sudah tercapai maka NGINX akan mengaggap Server tersebut down yang kemudian NGINX akan mengarahkan Client ke Server lain dan mengantisipasi agar tidak ada Request Client yang mengarah ke Server tersebut. Meski begitu, NGINX akan tetap mencoba untuk memberikan Request ke Server tersebut, apabila sudah mendapat jawaban kembali maka Client yang diarahkan ke Server lain akan diarahkan kembali ke Server tersebut.

Image
Konfigurasi Final Sementara

g. Referensi
NGINX Admin Guide
UpCloud – How to Configure Load Balancing with NGINX
DigitalOcean – Understanding Nginx HTTP Proxying, Load Balancing, Buffering, and Caching

sumber : https://penguinstunnel.blogspot.com/2017/03/web-server-load-balancing-dan-reverse.html