Setting Dasar HaProxy sebagai HTTP[s] Load Balancer

A. Apa itu load balancer?

Load balancer artinya adalah pembagian beban. Dalam dunia web, HTTP Load Balancer artinya membagi beban server-server HTTP agar beban tidak terpusat pada satu server saja. Ya, atas alasan teknis pembagian beban, sebuah server web sering dibuat lebih dari satu. Jika salah satu mengalami beban penuh, dapat dioper beban ke server lainnya. Load balancer akan diletakkan pada bagian depan server-server tersebut, menjadi perantara client dan server.

B. Apa itu HAProxy?
HAProxy adalah sebuah produk opensource yang dibuat secara khusus untuk dapat melakukan pembagian request ke arah server. HA sendiri singkatan dari High Availability, yang secara teknis artinya adalah kondisi tidak akan mati saat salah satu sumber server mengalami kondisi down atau overload.
Pada gambar di bawah digambarkan sebuah susunan topologi server lengkap dengan backend maupun proxy (frontend). Proxy sebenarnya dapat menggunakan seluruh HTTP server seperti Apache dan Nginx. Namun HAProxy memang telah didesain untuk secara khusus mengatur tentang load balancing saja.

haproxy1

Gambar 1. Ilustrasi posisi load balancer pada topologi HTTP Server

HAProxy menerima request dari client, dan diberikan pada server-server backend (upstream) di belakangnya. Beban akan diatur oleh proxy dengan beberapa pilihan algoritma.

  1. Round Robin : haproxy akan mengambil source dengan beban yang setara antara satu server dengan server lainnya
  2. Leastconn : haproxy akan mengambil jumlah koneksi network paling sedikit
  3. First : haproxy akan mengambil dari server upstream pertama lebih dulu, setelah terlacak beban penuh, haproxy akan mengambil pada server upstream selanjutnya
  4. Source : haproxy akan mengambil data dari server, secara tetap, tidak berpindah-pindah. Sehingga jika sebuah sessi koneksi terjadi di upstream pertama, tidak akan terputus hingga sessi koneksi tersebut diakhiri

Cara instalasi HAProxy pada Linux cukup mudah, tinggal memanggil online-packet-manager seperti yum, apt, zypper, yast dan lain sebagainya. Misal adalah :

#ubuntu16 ke atas atau debian8 keatas
apt install haproxy
systemctl enable haproxy
service haproxy start
service haproxy status
#centos7 ke atas
yum install epel-release
yum install haproxy
systemctl enable haproxy
systemctl start haproxy
systemctl status haproxy
#ubuntu15 dan sebelumnya
apt-get install haproxy
systemctl enable haproxy
service haproxy start
service haproxy status
#centos6
yum install epel-release
yum install haproxy
chkconfig haproxy on
service haproxy start

Lokasi file konfigurasi HAProxy adalah di : /etc/haproxy/haproxy.cfg. Bukalah dengan text-editor seperti vim, nano, ee atau apapun. Akan ditemui isi file sebagai berikut :

 

global
	log /dev/log	local0
	log /dev/log	local1 notice
	chroot /var/lib/haproxy
	stats socket /run/haproxy/admin.sock mode 660 level admin
	stats timeout 30s
	user haproxy
	group haproxy
	daemon
.
.
.
.

defaults
	log	global
	mode	http
	option	httplog
	option	dontlognull
	option 	forwardfor
.
.
.
.
#dst

 

 

C. Setting HAProxy untuk Load Balancer Single Domain

Sebuah situs portal berita yang memiliki traffic sangat tinggi akan membutuhkan load balancer dalam proses pengaturan beban. Di sini digambarkan alur kerja sebuah HAProxy untuk melayani traffic HTTP yang bekerja dengan satu domain.

haproxy-req-scheme

 

Gambar 2. Ilustrasi Request user hingga node backend, pada single domain

Request User akan diterima oleh HAProxy (frontend) dan kemudian akan dibagikan pada server-server node di belakangnya (backend). Maka susunan konfigurasi HAProxy akan menjadi seperti berikut:

 

#lanjutan konfigurasi di atas
	#memberi nama bind
	frontend [nama-http-proxy]
		bind *:80
		default_backend [nama-http-upstream-belakang]

	backend nama-http-upstream-belakang
		balance roundrobin
		server [namaserver/servername-1] ip.ad.dr.es:port check
		server [namaserver/servername-2] ip.ad.dr.es:port check
		server [namaserver/servername-3] ip.ad.dr.es:port check

Misal lengkapnya adalah

global
	log /dev/log	local0
	log /dev/log	local1 notice
	chroot /var/lib/haproxy
	stats socket /run/haproxy/admin.sock mode 660 level admin
	stats timeout 30s
	user haproxy
	group haproxy
	daemon

	# Default SSL material locations
	ca-base /etc/ssl/certs
	crt-base /etc/ssl/private

	# Default ciphers to use on SSL-enabled listening sockets.
	# For more information, see ciphers(1SSL). This list is from:
	#  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
	# An alternative list with additional directives can be obtained from
	#  https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
	ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
	ssl-default-bind-options no-sslv3

defaults
	log	global
	mode	http
	option	httplog
	option	dontlognull
	option 	forwardfor
        timeout connect 5000
        timeout client  50000
        timeout server  50000
	errorfile 400 /etc/haproxy/errors/400.http
	errorfile 403 /etc/haproxy/errors/403.http
	errorfile 408 /etc/haproxy/errors/408.http
	errorfile 500 /etc/haproxy/errors/500.http
	errorfile 502 /etc/haproxy/errors/502.http
	errorfile 503 /etc/haproxy/errors/503.http
	errorfile 504 /etc/haproxy/errors/504.http

###############start-http-80#################

	#memberi nama bind
	frontend my_front_server
		bind *:80
		default_backend my_back_server

	backend my_back_server
		balance roundrobin
		server node1 10.10.10.1:80 check
		server node2 10.10.10.2:80 check
		server node3 10.10.10.3:80 check

Pada code di atas, menggunakan tiga buah server upstream / backend yaitu 10.10.10.1, 10.10.10.2, 10.10.10.3

 

D. Setting HAProxy untuk Banyak Domain dalam Satu Server HAProxy

Penggunaan banyak domain dalam satu server, jika dalam nGinX atau Apache akan diatur dengan menggunakan konsep VirtualHost (dapat dilihat di sini https://blogit.bimosaurus.com/2015/06/13/flash-back-virtualhost-apache-dan-nginx/), maka pada HAProxy akan menggunakan konsep Access List (ACL). (ACL ini mengingatkan saya pada penggunaan SQUID)

Berikut di bawah adalah gambar skemanya:

haproxy-domain

Gambar 3 Skema HAProxy sebagai Load Balancer untuk multi domain

Pada Tag Frontend, traffic akan ditandai.

  • Jika request ke server tersebut dengan menggunakan nama panggil domain1, akan diberikan nama acl1.
  • Jika request ke server tersebut dengan menggunakan nama panggil domain2, akan diberikan nama acl2

Kemudian pada Tag Backend, akan memunculkan aturan backend sejumlah ACL yang dibuat. Masing-masing aturan backend akan berisi aturan-aturan lagi seperti metode algoritma load balancer dan menentukan node.

#lanjutan dari global dan default

	frontend [nama-http-proxy]
		bind *:80
		acl nama_host_1 hdr(host) -i nama_domain_1
		acl nama_host_2 hdr(host) -i nama_domain_2
		acl nama_host_3 hdr(host) -i nama_domain_3

		use_backend backend_1 if nama_host_1
		use_backend backend_2 if nama_host_2
		use_backend backend_3 if nama_host_3

	backend backend_1
		balance {roundrobin|leastconn|first|source}
		server [namaserver/servername-1] ip.ad.dr.es:port check
		server [namaserver/servername-2] ip.ad.dr.es:port check
		server [namaserver/servername-3] ip.ad.dr.es:port check

	backend backend_2
		balance roundrobin
		server [namaserver/servername-1] ip.ad.dr.es:port check
		server [namaserver/servername-2] ip.ad.dr.es:port check
		server [namaserver/servername-3] ip.ad.dr.es:port check

	backend backend_3
		balance roundrobin
		server [namaserver/servername-1] ip.ad.dr.es:port check
		server [namaserver/servername-2] ip.ad.dr.es:port check
		server [namaserver/servername-3] ip.ad.dr.es:port check

Selengkapnya kira-kira adalah seperti berikut :

global
	log /dev/log	local0
	log /dev/log	local1 notice
	chroot /var/lib/haproxy
	stats socket /run/haproxy/admin.sock mode 660 level admin
	stats timeout 30s
	user haproxy
	group haproxy
        stats auth usermasuk:passwordmasuk
        stats uri /haproxy?stats
	daemon

	# Default SSL material locations
	ca-base /etc/ssl/certs
	crt-base /etc/ssl/private

	# Default ciphers to use on SSL-enabled listening sockets.
	# For more information, see ciphers(1SSL). This list is from:
	#  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
	# An alternative list with additional directives can be obtained from
	#  https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
	ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
	ssl-default-bind-options no-sslv3

defaults
	log	global
	mode	http
	option	httplog
	option	dontlognull
	option 	forwardfor
        timeout connect 5000
        timeout client  50000
        timeout server  50000
	errorfile 400 /etc/haproxy/errors/400.http
	errorfile 403 /etc/haproxy/errors/403.http
	errorfile 408 /etc/haproxy/errors/408.http
	errorfile 500 /etc/haproxy/errors/500.http
	errorfile 502 /etc/haproxy/errors/502.http
	errorfile 503 /etc/haproxy/errors/503.http
	errorfile 504 /etc/haproxy/errors/504.http

###############start-http-80#################

	frontend my_frontend_server
		bind *:80
		acl acl_abcde hdr(host) -i abcde.bimosaurus.com
		acl acl_fghij hdr(host) -i fghij.bimosaurus.com
		acl acl_klmno hdr(host) -i klmno.bimosaurus.com

		use_backend backend_abcde if acl_abcde
		use_backend backend_fghij if acl_fghij
		use_backend backend_klmno if acl_klmno

	backend abcde
		balance roundrobin
		server node_1a 10.10.10.1:80 check
		server node_1b 10.10.10.2:80 check
		server node_1c 10.10.10.3:80 check

	backend fghij
		balance roundrobin
		server node_2a 10.10.10.4:80 check
		server node_2b 10.10.10.5:80 check
		server node_2c 10.10.10.6:80 check

	backend klmno
		balance roundrobin
		server node_3a 10.10.10.7:80 check
		server node_3b 10.10.10.8:80 check
		server node_3c 10.10.10.9:80 check

###contoh bonus untuk nampilkan stat

Kira-kira seperti diatas tersebut. Perhatikan pada bagian :

        stats auth usermasuk:passwordmasuk
        stats uri /haproxy?stats

Ini mengartikan bahwa jika si server HAProxy direquest dengan tambahan belakang /haproxy?stats maka akan memunculkan dialog user password sesuai dengan yang ditentukan. Jika sukses, maka akan muncul tampilan statistik seperti berikut :

Screenshot from 2018-05-16 19-44-21

Gambar 4. Tampilan Statistik Request HAProxy

 Selamat mencoba.

Leave a Reply

Your email address will not be published. Required fields are marked *