HAProxy je open source nástroj pro vyrovnávání zátěže a proxy služby s vysokou dostupností pro síťové aplikace založené na TCP a HTTP. Snadno se používá, hodí se pro velké objemy webových stránek a je bezproblémová integrace do stávajících architektur. Nabízí transparentní připojení, vytížení serveru, vynucování politik, omezení připojení kromě své primární funkce proxy služby. V tomto článku vysvětlujeme, jak nastavit haproxy v Ubuntu 16.04.
1. Nastavení sítě
Přidáme tři webové servery běžící s Apache2 a jeden HAPROXY server, který bude proxy všechny požadavky/odpovědi tří webových služeb v naší síti.
Následující seznam podrobností o webovém serveru v naší síti.
Server 1: site1.local 10.0.1.116
Server 2: site2.local 10.0.1.117
Server 3: site3.local 10.0.1.119
Server HAProxy:
load-balancer.local 10.0.1.118
K load-balancer.local také připojíme jednu veřejnou IP, abychom k ní měli přístup z veřejné domény (volitelné). Pokud k němu nechcete přistupovat z veřejné domény, můžete přeskočit připojení veřejné IP za předpokladu, že budete přistupovat k proxy serveru ve vaší síti.
2. Nakonfigurujte název hostitele
Vzhledem k tomu, že budeme přistupovat k load balanceru a webovému serveru jejich jménem (ne IPADDRESS), proto nastavíme hostitelské jméno tří webových serverů a jednoho proxy serveru. Nastavíme název hostitele tří webových serverů a proxy serveru jako site1.local, site2.local, site3.local a load-balancer.local.
Nastavíme název hostitele 10.0.1.116 jako site1.local v /etc/hosts a /etc/hostname
root@site1:~# vi /etc/hosts
127.0.0.1 localhost
10.0.1.116 site1.local
root@site1:~# vi /etc/hostname
site1.local
Restartujte síť
root@site1:~# service networking restart
Nainstalujte apache a povolte jej.
root@site1:~# apt-get install apache2
root@site1:~# service apache2 enable
root@site1:~# service apache2 start
Vytvořte soubor indexu pro site1.local
root@site1:~# vi /var/www/html/index.html
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.116 </h1>
</body>
</html>
Přidat pravidlo brány firewall pro http
# ufw allow 80/tcp
# ufw reload
Nyní zkontrolujte, zda máte přístup k site1
root@site1:~# curl -I site1.local
HTTP/1.1 200 OK
Date: Sun, 14 Aug 2016 14:30:29 GMT
Server: Apache/2.4.18 (Ubuntu)
Last-Modified: Sun, 14 Aug 2016 03:50:35 GMT
ETag: "ec-53a0004a26c6d"
Accept-Ranges: bytes
Content-Length: 236
Vary: Accept-Encoding
Content-Type: text/html
NEBO
root@site1:~# curl site1.local
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.116 </h1>
</body>
</html>
Opakujte krok 2 pro web2 (10.0.1.117) a web3 (10.0.1.119).
V proxy serveru přidejte všechny tři položky webového serveru ( IPADDRESS HOSTNAME ) kromě jeho vlastního názvu hostitele jako load-balancer.local
root@load-balancer:~# vi /etc/hosts
127.0.0.1 localhost
10.0.1.118 load-balancer.local
10.0.1.116 site1.local
10.0.1.117 site2.local
10.0.1.119 site3.local
Nastavte název hostitele proxy serveru
root@load-balancer:~# vi /etc/hostname
load-balancer.local
3. Nainstalujte HAProxy
Před instalací aktualizujte Ubuntu. Spusťte následující příkaz jako root nebo pomocí sudo aktualizujte ubuntu.
root@load-balancer:~# apt-get update
Nyní aktualizujte balíčky v systému.
root@load-balancer:~# apt-get upgrade
Nainstalujte jej provedením následujícího příkazu v terminálu.
root@load-balancer:~# apt-get install haproxy
Chcete-li povolit službu jako démona, upravte /etc/defaults/haproxy a přidejte následující řádek.
POVOLENO=1
root@load-balancer:~# vi /etc/defaults/haproxy
ENABLED=1
# Add extra flags here
#EXTRAOPTS="-de -m 16"
Spusťte službu
root@load-balancer:~# service haproxy start
4. Nakonfigurujte HAProxy
Konfigurační soubor se nachází v /etc/haproxy/haproxy.cfg a má dvě části, globální a proxy, část Global nastavuje parametry celého procesu a část proxy se skládá z výchozích, naslouchacích, front-end a back-end částí.
Upravte konfigurační soubor pomocí textového editoru vi
root@load-balancer:~# vi /etc/haproxy/haproxy.cfg
Výchozí konfigurační soubor bude vypadat asi takto. Ponechte globální a výchozí sekci tak, jak jsou.
Globální sekce
global
log 127.0.0.1 local0
log 127.0.0.1 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
Výchozí sekce
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
Přidání posluchače:
Část "frontend" popisuje sadu naslouchacích soketů přijímajících klientská připojení. Front-end definuje, jak by měly být požadavky zpracovány a odeslány na back-end server:
frontend Local_Server
bind 10.0.1.118:80
mode http
default_backend My_Web_Servers
Přidání back-endových webových serverů:
Část „back-end“ popisuje sadu serverů, ke kterým se proxy připojí, aby předávala příchozí spojení. Jak je uvedeno výše, nástroj pro vyrovnávání zatížení nyní naslouchá na portu 80. Nyní definujte back-endové webové servery, kam pošle požadavek.
backend My_Web_Servers
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 site1.local 10.0.1.116:80
server site2.local 10.0.1.117:80
server site3.local 10.0.1.119:80
Na konec výše uvedených tří řádků můžete přidat parametr „check“ pro kontrolu parametru zdraví vašich webových serverů.
V závislosti na vašem požadavku můžete použít jiný vyrovnávací algoritmus.
Leastconn
Vybere server s nejmenším počtem připojení – doporučuje se pro delší relace. Servery ve stejném backendu se také střídají v režimu round-robin.
Zdroj
Tím se vybere, který server se má použít, na základě hash zdrojové IP, tj. IP adresy vašeho uživatele. Toto je jeden způsob, jak zajistit, že se uživatel připojí ke stejnému serveru.
Povolit statistiky (volitelné)
Nyní, pokud chcete, můžete povolit statistiky přidáním následujícího do konfiguračního souboru.
listen stats
bind :9000
stats enable
stats hide-version
stats refresh 20s
stats show-node
stats uri /stats
5. Restartujte HAProxy
Protože jste provedli všechny potřebné konfigurace pro proxy server, ověřte konfigurační soubor před restartováním služby pomocí následujícího příkazu.
root@load-balancer:~# haproxy -c -f /etc/haproxy/haproxy.cfg
Pokud výše uvedený příkaz vrátí výstup jako „konfigurační soubor je platný“, restartujte službu HAProxy
root@load-balancer:~# service haproxy restart
Nyní zkontrolujte stav serveru HAProxy.
root@load-balancer:~# service haproxy status
6. Otestujte HAProxy
Před testováním se ujistěte, že můžete pingnout webový server (site1.local, site2.local, site3.local) z load-balancer.local
root@load-balancer:~# ping site1.local
PING site1.local (10.0.1.116) 56(84) bytes of data.
64 bytes from site1.local (10.0.1.116): icmp_seq=1 ttl=64 time=0.906 ms
64 bytes from site1.local (10.0.1.116): icmp_seq=2 ttl=64 time=0.906 ms
64 bytes from site1.local (10.0.1.116): icmp_seq=3 ttl=64 time=0.648 ms
root@load-balancer:~# ping site2.local
PING site2.local (10.0.1.117) 56(84) bytes of data.
64 bytes from site2.local (10.0.1.117): icmp_seq=1 ttl=64 time=3.02 ms
64 bytes from site2.local (10.0.1.117): icmp_seq=2 ttl=64 time=0.687 ms
64 bytes from site2.local (10.0.1.117): icmp_seq=3 ttl=64 time=0.778 ms
root@load-balancer:~# ping site3.local
PING site3.local (10.0.1.119) 56(84) bytes of data.
64 bytes from site3.local (10.0.1.119): icmp_seq=1 ttl=64 time=0.830 ms
64 bytes from site3.local (10.0.1.119): icmp_seq=2 ttl=64 time=0.631 ms
64 bytes from site3.local (10.0.1.119): icmp_seq=3 ttl=64 time=0.771 ms
Otestujte HAPROXY pomocí CURL
Chcete-li otestovat spuštění následujícího skriptu z terminálu, zjistíte, že nástroj pro vyrovnávání zatížení odesílá požadavek na tři webové servery v kruhové metodě.
root@load-balancer:~# while true; do curl http://10.0.1.118; sleep 1; done
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.119 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.116 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.117 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.119 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.116 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.117 </h1>
</body>
</html>
...............................
...............................
...............................
Test v prohlížeči:
Nasměrujte svůj prohlížeč na http://load-balancer.local nebo http://Server-Public-IP. Obdržíte odpověď od tří webových serverů v kruhovém pořadí potvrzující, že funguje podle našeho očekávání. Při každém obnovení odesílá proxy server požadavek na back-end webový server jeden po druhém.
Můžete také navštívit statickou adresu URL, která je nakonfigurována v poslední části konfiguračního souboru, abyste potvrdili, že jsou porty otevřeny pro provoz. Jednoduše přejděte na veřejnou IP nebo http://load-balancer.local na portu 9000.
Přejděte například na http://load-balancer.local:9000/stats
Stav serveru můžete také sledovat z terminálu pomocí HATOP. HATOP je nástroj třetí strany, který extrahuje statistiky ze souboru soketu vytvořeného nástrojem pro vyrovnávání zatížení. Nainstalujte HATOP provedením následujícího příkazu z terminálu.
root@load-balancer:~# apt-get install hatop
Normálně při spouštění HATOP musíte použít parametr -s s příkazem sudo hatop -s /var/run/haproxy.sock. Abyste nemuseli zadávat parametr -s při volání HATOP, můžete do souboru ~/.bashrc vložit následující řádek:
exportovat unix-socket=/var/run/haproxy.sock
7. Protokolování HAProxy
Upravte /etc/rsyslog.d/haproxy.conf a přidejte do něj následující řádky.
local0.* -/var/log/haproxy_0.log
local1.* -/var/log/haproxy_1.log
Restartujte rsyslog
root@load-balancer:~# service rsyslog restart
Nyní zkontrolujte protokoly pomocí následujícího příkazu
root@load-balancer:~# tail -f /var/log/haproxy*.log
Také přidejte řádek „debug“ do globální části konfiguračního souboru pro podrobné protokolování.
Závěr
S HAProxy můžete zvýšit výkon a dostupnost vaší webové aplikace. Tento tutoriál je pouze úvodem do vyvažování zátěže, i když dokáže mnohem více, než je popsáno v tomto návodu. Vysokou dostupnost můžete zlepšit nastavením pohyblivé IP mezi více nástroji pro vyrovnávání zatížení, abyste se chránili před selháním v jediném nástroji pro vyrovnávání zatížení.