Cara Setting Load Balancing dengan HAProxy
HAProxy adalah perangkat lunak open source yang berfungsi sebagai load balancing dan proxy untuk TCP dan HTTP. Load balancing adalah metode untuk mendistribusikan atau membagikan trafik ke beberapa server.
0.Perangkat yang digunakan
Perangkat yang digunakan di tutorial ini:
- OS Ubuntu 18.04 LTS
- HAProxy
- Nginx web server
- PHP-FPM 7.2
- Node1: 10.130.127.167
- Node2: 10.130.128.35
- LoadBalancer: 128.199.187.215
- Domain: defnex.com
Node1 dan Node2 sudah terinstall Nginx web server dan PHP-FPM 7.2. Masing-masing node dibuatkan file index.php yang berisi tulisan node1 dan node2 sebagai halaman pengujian untuk mengetahui halaman yang ditampilkan berasal dari node yang mana.
1.Install HAProxy
Update dan install HAProxy.
1 2 | sudo apt update sudo apt install haproxy -y |
2.Konfigurasi HAProxy
Buka file konfigurasi HAProxy.
1 | sudo vim /etc/haproxy/haproxy.cfg |
File konfigurasi default dari haproxy.cfg.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners 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 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 |
Tambahkan konfigurasi untuk HAProxy listener.
1 2 3 4 | frontend http_front bind *:80 mode http default_backend http_back |
Tambahkan konfigurasi untuk backend web server.
1 2 3 4 5 6 7 8 9 | backend http_back mode http balance roundrobin option forwardfor http-request set-header X-Forwarded-Port %[dst_port] http-request add-header X-Forwarded-Proto https if { ssl_fc } option httpchk HEAD / HTTP/1.1rnHost:localhost server node1 10.130.127.167:80 server node2 10.130.128.35:80 |
Konfigurasi tambahan untuk statistik HAProxy.
1 2 3 4 5 6 7 8 | listen stats bind *:1234 stats enable stats hide-version stats refresh 30s stats show-node stats auth username:password stats uri /stats |
Hasil akhir konfigurasi HAProxy secara lengkap.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners 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 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 frontend http_front bind *:80 mode http default_backend http_back backend http_back mode http balance roundrobin option forwardfor http-request set-header X-Forwarded-Port %[dst_port] http-request add-header X-Forwarded-Proto https if { ssl_fc } option httpchk HEAD / HTTP/1.1rnHost:localhost server node1 10.130.127.167:80 server node2 10.130.128.35:80 listen stats bind *:1234 stats enable stats hide-version stats refresh 30s stats show-node stats auth username:password stats uri /stats |
Verifikasi konfigurasi dan restart HAProxy.
1 2 | sudo haproxy -c -f /etc/haproxy/haproxy.cfg sudo systemctl restart haproxy |
3.Pengujian
Browse domain, refresh halaman berulang kali sampai menampilkan file index.php dari Node1 dan Node2.
4.Statistik
Browse http://domain.com:1234/stats untuk membaca statistik HAProxy.
Selamat mencoba 🙂
Wah mantap terima kasih om buat tutorialnya
Asli membantu banget buat saya kerjain skripsi, terimakasih om
ok sip sama-sama om, semoga sukses skripsinya
permisi mas amin, mau nanya untuk konfigurasi HAProxy tcp bagaimana ya mas? saolnya kebanyakan tutorial yang saya liat hanya http dan saya coba oprec malah ada warning seperti ini mas
[WARNING] 351/052438 (5062) : parsing [/etc/haproxy/haproxy.cfg:46] : backend ‘broker_server’ : ‘option tcplog’ directive is ignored in backends.
[WARNING] 351/052438 (5062) : config : ‘stats’ statement ignored for proxy ‘stats’ as it requires HTTP mode.
Configuration file is valid
terimakasih mas mohon bantuannya dari mahasiswa pejuang skripsi
saya sendiri belum pernah coba yang seperti itu, coba cek link ini
Sangat membantu…tp untuk implementasi di Laravel masih agak bingung soalnya pas di coba langsung kehabisan session..masih coba ngulik2.
mas musa mohon pencerahannya…..? kalo node1 dan node2 nya biar isi nya sama ketika client di akses bagaimana cara nya ya menggunakan metode apa? glusterfs kah atau ada yg lebih bagus? mohon tutor dan pencerahannya nya untuk glusterfs server node1, node2 dll mas musa??
ada yang pakai metode file server dengan NFS, ada yang pakai sinkronisasi, dan juga yang pakai distributed file system seperti GlusterFS.
pak musa mau tanya, kalau ingin menambahkan stats untuk melakukan pengecekan statistikanya tapi belum memiliki domain itu caranya giamana pak? dan kalau dibuat secara lokal apa bisa dicek statistikanya pak? terima kasih pak musa
coba akses pakai IP address.
Untuk server moodle ada 3 server dengan database di masing2 server, itu mode algortima loadbalance nya yg bagus pake apa ya mas ?
coba pakai IP Hash. permintaan dari alamat IP tertentu akan selalu dikirim ke server yang sama berdasarkan hash dari alamat IP tersebut. berfungsi untuk menjaga session pengguna tetap pada server tertentu untuk konsistensi.
mau tanya bang,
pakai freebsd (1 IP Public) dengan 2 jail di dalamnya, sebut saja jail1 di 192.168.0.1 dan jail2 di 192.168.0.2 (pakai lo1)
ane ada 2 (sub)domain sebut saja satu.domain.tld dan dua.domain.tld
gimana ya cara menghubungkan supaya satu.domain.tld mengarah ke jail1, dan dua.domain.tld mengarah ke jail2?
terima kasih sebelumnya bang.
coba ikuti tutorial ini Routing Multiple Domains using HAProxy (HTTP and HTTPS)