HAProxy ile Ubuntu 16.04 Instance Üzerinde Yük Dengeleme
Bu yazımızda 3 tane instance kullanacağız. 1 instance yük dengeleme görevini üstlenecek. Diğer instance’lar ise web sunucusu görevinde olacaklar. Bunun için öncelikle Skyatlas panelinden 3 tane Ubuntu 16.04 instance oluşturuyoruz.
Instance 1 – Yük dengeleyici
Public IP adresi : x.x.x.x
Private IP adresi : 10.0.0.108
Instance 2 – Web sunucusu
Private IP adresi : 10.0.0.107
Instance 3 – Web sunucusu
Private IP adresi : 10.0.0.106
Öncelikle yük dengeleyici sunucumuza ssh ile bağlanıyoruz ve haproxy paketlerini kuruyoruz. Bunun için
haproxyinstance:~$ sudo apt-get install haproxy
komutunu kullanıyoruz. HAProxy kurulumu tamamlandıktan sonra web sunucusu olan instance'larımıza ssh ile bağlanıp ikisinede Apache2 paketlerini indirmemiz gerekiyor.
webinstance1:~$ sudo apt-get install apache2
webinstance2:~$ sudo apt-get install apache2
Web sunucularımızın kurulumları gerçekleştikten sonra tekrar yük dengeleyici instance'ımıza geçiyoruz ve şimdi HAProxy konfigürasyon dosyasına web sunucularımız arasındaki yük dağılımını sağlayacak ayarları yazıyoruz. HAProxy konfigürasyon dosyası :
/etc/haproxy/haproxy.cfg
Herhangi bir editör ile bu dosyayı açarak , vim editör kullanacağım, gerekli satırları ekleyeceğiz. Burada birkaç tane önemli anahtar kelime mevcut. haproxy.cfg dosyasının görünümü aşağıdaki gibidir.
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/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!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
Burada hangi sunucular arasında yük dengeleme yapacağımızı belirtmemiz gerekiyor. Bunun için konfigürasyon dosyasının en altına şu satırları eklememiz gerekiyor :
listen firstbalance
bind *:80
balance roundrobin
option forwardfor
option httpchk
server webinstance1 10.0.0.106:80 check
server webinstance2 10.0.0.107:80 check
Dengelemeyi roundrobin algoritması ile yapacağımızı belirtmiş oluyoruz.Apache2 web sunucusu 80 portunda çalıştığı için 80 portunu dinliyoruz ve bu porta gelen istekleri dağıtıyoruz. En alt satırlarda ise dinlenecek olan sunucularımızın private IP adreslerini belirtiyoruz. Bu işlemlerden sonra haproxy servisini yeniden başlatmamız gerekiyor.
haproxyinstance:~$ sudo service haproxy restart
Hangi sunucuya yönlendirildiğimizi anlamak için web sunucularımızdaki Default Apache sayfasını değiştirmemiz gerekiyor. Bunun için web sunucularımıza ssh ile bağlanmamız gerekiyor. Bağlandıktan sonra /var/www/html/index.html dosyasını siliyoruz ve yeni bir index.html dosyası oluşturuyoruz.
webinstance1~$: cd /var/www/html
webinstance1~$: sudo rm index.html
webinstance1~$: vim index.html
Bu dosyanın içine basit bir html kodu yazıp kaydediyoruz ve apache2 servisini yeniden başlatıyoruz.
<html>
<header><title>Web Instance 1</title></header>
<body>Web instance 1</body>
</html>
webinstance1~$: sudo service apache2 restart
Aynı işlemi diğer web sunucumuzda da gerçekleştiriyoruz.
webinstance2~$: cd /var/www/html
webinstance2~$: sudo rm index.html
webinstance2~$: vim index.html
<html>
<header><title>Web Instance 2</title></header>
<body>Web instance 2</body>
</html>
webinstance2~$: sudo service apache2 restart
Bu işlemlerden sonra web tarayıcısından yük dengeleyici instance'ımızın public IP adresini yazıp sayfaları yenilersek bizi diğer iki web sunucumuzdan birine yönlendirdiğini göreceğiz.Ya da terminal üzerinden curl komutu ile test edebiliriz.
$ curl YUK_DENGELEYİCİ_PUBLIC_IP
<html>
<header><title>This is web instance2</title></header>
<body>
Web Instance 2
</body>
</html>
$ curl YUK_DENGELEYİCİ_PUBLIC_IP
<html>
<header><title>This is web instance1</title></header>
<body>
Web Instance 1
</body>
</html>
Görüldüğü gibi yük dengeleyici isteklerimizi web sunucuları arasında dağıttı.