HAProxy nebo High Availability Proxy je open source software pro vyrovnávání zátěže TCP a HTTP a proxy server. HAProxy byl napsán Willy Tarreau v C, podporuje SSL, komprese, zachování, vlastní formáty protokolů a přepisování záhlaví. HAProxy je rychlý a lehký proxy server a nástroj pro vyrovnávání zatížení s malou paměťovou náročností a nízkým využitím CPU. Používají ho velké weby jako Github, StackOverflow, Reddit, Tumblr, Twitter a další. V posledních letech se stal nejoblíbenějším softwarovým nástrojem pro vyrovnávání zatížení a proxy serverem.
V tomto tutoriálu projdete instalací a konfigurací HAProxy na RHEL 8 / CentOS 8. Nainstalujeme HAProxy na jeden server a poté nainstalujeme webový server Nginx na ostatní servery. HAProxy bude fungovat jako vyvažovač zatížení pro webové servery Nginx.
V tomto tutoriálu se naučíte:
- Architektura a koncepty HAProxy
- Nakonfigurujte soubor hostitelů pro rozlišení názvů
- Nainstalujte a nakonfigurujte HAProxy
- Nainstalujte a nakonfigurujte Nginx
- Testování funkce Load Balancing
- Přístup k adrese URL statistiky HAProxy
Architektura HAProxy.
Požadavky na software a použité konvence
| Kategorie | Požadavky, konvence nebo použitá verze softwaru |
|---|---|
| Systém | RHEL 8 / CentOS 8 |
| Software | HAProxy, Nginx |
| Jiné | Privilegovaný přístup k vašemu systému Linux jako root nebo prostřednictvím sudo příkaz. |
| Konvence | # – vyžaduje, aby dané linuxové příkazy byly spouštěny s právy root buď přímo jako uživatel root, nebo pomocí sudo příkaz$ – vyžaduje, aby dané linuxové příkazy byly spouštěny jako běžný neprivilegovaný uživatel |
Architektura a koncepty HAProxy
HAProxy může běžet ve dvou režimech:TCP režim Layer 4 a HTTP Mode Layer 7. V režimu Layer 4 TCP předává HAProxy RAW TCP pakety z klienta na aplikační servery. V režimu HTTP vrstvy 7 HAProxy analyzuje hlavičku HTTP, než je předá aplikačním serverům. V tomto tutoriálu použijeme Nginx jako webový server, který podporuje režim HTTP Layer 7.
Layer 4 Load Balancing.
Layer 7 Load Balancing.
Balance Algorithm je algoritmus, který používá HAProxy k výběru serveru při vyrovnávání zátěže. K dispozici jsou následující režimy:
Roundrobin
Toto je nejjednodušší balanční algoritmus. Každé nové připojení bude zpracováno dalším backendovým serverem. Pokud je dosaženo posledního backendového serveru v seznamu, začne znovu od začátku backendového seznamu.
Leastconn
Nové připojení bude zpracováno backendovým serverem s nejmenším počtem připojení. To je užitečné, když se čas a zatížení požadavků hodně liší.
Zdroj
Toto je pro pevné relace, IP klienta bude hashována, aby se určil backendový server, který přijal poslední požadavek z této IP. Takže IP A bude vždy zpracována backendem1 a IP B bude vždy zpracována banckend2, aby nedošlo k přerušení relací.
Nakonfigurujte soubor hostitelů pro rozlišení názvů
Přihlaste se k serveru nástroje pro vyrovnávání zatížení a upravte /etc/hosts soubor a HAProxy loadbalancer, názvy hostitelů nginx1, nginx2. Zkopírujte stejný soubor na další dva uzly nginx a zkontrolujte síťové připojení pomocí příkazu ping.
# vim /etc/hosts
192.168.1.108 loadbalancer.example.com
192.168.1.104 nginx1.example.com
192.168.1.105 nginx2.example.com
Nainstalujte a nakonfigurujte HAProxy
HAProxy je k dispozici v úložišti RHEL 8 / CentOS 8, proto se přihlaste k serveru loadbalancer a nainstalujte balíček HAProxy pomocí tohoto příkazu yum.
# yum install haproxy
Po úspěšné instalaci můžete použít níže uvedený příkaz k ověření instalace.
# yum info haproxy
# yum info haproxy
Updating Subscription Management repositories.
Updating Subscription Management repositories.
Last metadata expiration check: 0:06:03 ago on Sat 16 Mar 2019 11:40:24 PM +04.
Installed Packages
Name : haproxy
Version : 1.8.14
Release : 1.el8
Arch : x86_64
Size : 4.1 M
Source : haproxy-1.8.14-1.el8.src.rpm
Repo : @System
From repo : rhel-8-for-x86_64-appstream-beta-rpms
Summary : HAProxy reverse proxy for high availability environments
URL : http://www.haproxy.org/
License : GPLv2+
Description : HAProxy is a TCP/HTTP reverse proxy which is particularly suited for high
: availability environments. Indeed, it can:
: - route HTTP requests depending on statically assigned cookies
: - spread load among several servers while assuring server persistence
: through the use of HTTP cookies
: - switch to backup servers in the event a main one fails
: - accept connections to special ports dedicated to service monitoring
: - stop accepting connections without breaking existing ones
: - add, modify, and delete HTTP headers in both directions
: - block requests matching particular patterns
: - report detailed status to authenticated users from a URI
: intercepted from the application
Po dokončení instalace přejděte do /etc/haproxy/ adresář a zálohujte původní konfigurační soubor.
# cd /etc/haproxy/ # cp haproxy.cfg haproxy.cfg.orig
Dále proveďte níže uvedené změny v konfiguračním souboru HAProxy haproxy.cfg s kterýmkoli editorem.
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# https://www.haproxy.org/download/1.8/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
# utilize system-wide crypto-policies
ssl-default-bind-ciphers PROFILE=SYSTEM
ssl-default-server-ciphers PROFILE=SYSTEM
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# HAProxy Monitoring Config
#---------------------------------------------------------------------
listen stats
bind loadbalancer.example.com:8080 # HAProxy Monitoring run on port 8080
mode http
option forwardfor
option httpclose
stats enable
stats show-legends
stats refresh 5s
stats uri /stats # URL for HAProxy monitoring
stats realm Haproxy\ Statistics
stats auth admin:admin # User and Password for login to the monitoring dashboard
#stats admin if TRUE
default_backend loadbalancer # This is optionally for monitoring backend
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend loadbalancer
bind loadbalancer.example.com:80
#acl url_static path_beg -i /static /images /javascript /stylesheets
#acl url_static path_end -i .jpg .gif .png .css .js
#use_backend static if url_static
option http-server-close
option forwardfor
default_backend loadbalancer
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
#backend static
# balance roundrobin
# server static 127.0.0.1:4331 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend loadbalancer
balance roundrobin # Balance algorithm
option httpchk HEAD / HTTP/1.1\r\nHost:\ localhost # Check the server application is up and healty - 200 status code
server nginx1.example.com 192.168.1.104:80 check # NGINX Server1
server nginx2.example.com 192.168.1.105:80 check # NGNIX Server2
Uložte tento konfigurační soubor a ukončete jej.
Nyní nakonfigurujeme démona rsyslog pro protokolování statistik HAProxy. Upravte soubor rsyslog.conf aby rsyslog mohl používat UDP port 514. Otevřete konfigurační soubor rsyslog a odkomentujte řádky, abyste povolili připojení UDP.
# vim /etc/rsyslog.conf
module(load="imudp") # needs to be done just once input(type="imudp" port="514")
Uložte soubor s výše uvedenými změnami a ukončete. Poté vytvořte nový konfigurační soubor HAProxy pro rsyslog a přidejte do něj níže uvedené položky.
# cd /etc/rsyslog.d/ # vi haproxy.conf
local2.=info /var/log/haproxy-access.log # For Access Log local2.notice /var/log/haproxy-info.log # For Service Info - Backend, loadbalancer
Nyní restartujte rsyslog a poté spusťte službu HAProxy a přidejte HAProxy, aby se spustila při spouštění.
# systemctl restart rsyslog # systemctl start haproxy # systemctl enable haproxy
Nainstalujte a nakonfigurujte Nginx
Nginx je již součástí stávajícího repozitáře RHEL 8 / CentOS 8 a lze jej nainstalovat pomocí následujícího příkazu.
# yum install nginx
Po instalaci můžete instalaci ověřit pomocí tohoto příkazu.
# yum info nginx
# yum info nginx
Updating Subscription Management repositories.
Updating Subscription Management repositories.
Last metadata expiration check: 0:06:14 ago on Sat 16 Mar 2019 11:40:24 PM +04.
Installed Packages
Name : nginx
Epoch : 1
Version : 1.14.0
Release : 3.el8+1631+ba902cf0
Arch : x86_64
Size : 568 k
Source : nginx-1.14.0-3.el8+1631+ba902cf0.src.rpm
Repo : rhel-8-for-x86_64-appstream-beta-rpms
Summary : A high performance web server and reverse proxy server
URL : http://nginx.org/
License : BSD
Description : Nginx is a web server and a reverse proxy server for HTTP, SMTP, POP3 and
: IMAP protocols, with a strong focus on high concurrency, performance and low
: memory usage.
Jakmile je Nginx nainstalován, přejděte do webového adresáře a změňte index.html soubor podle toho. Ujistěte se, že na serveru nginx1 a nginx2 provádíte níže uvedené kroky.
# cd /usr/share/nginx/html # ls -lrth total 20K -rw-r--r--. 1 root root 2.8K Oct 31 2016 poweredby.png -rw-r--r--. 1 root root 368 Oct 31 2016 nginx-logo.png -rw-r--r--. 1 root root 3.7K Mar 16 20:39 50x.html -rw-r--r--. 1 root root 3.6K Mar 16 20:39 404.html -rw-r--r--. 1 root root 3.7K Mar 16 20:42 index.html
Dále přidejte Nginx, aby se spustil v době spouštění, a poté spusťte démona pomocí příkazů níže.
# systemctl enable nginx # systemctl start nginx
Testování funkce Load Balancing
Testování lze provést procházením a přístupem k loadbalanceru IP 192.168.1.108 (pro můj případ) a uvidíte, že jednou to jde do uzlu Nginx1 a podruhé to půjde do uzlu Nginx2 v kruhovém režimu.
Webová stránka na NGINX Node1.
Webová stránka na NGINX Node2.
Můžete také zkontrolovat /var/log/haproxy-access.log abyste získali podrobné informace o vyrovnávání zátěže.
Přístup k URL statistiky HAProxy
Přístup k řídicímu panelu pro HAProxy Statistical Report, který běží na portu 8080 s uživatelským jménem a heslem definovaným v haproxy.cfg soubor.
http://192.168.1.108:8080/stats
Přístup k URL statistik HAProxy.
Dashboard statistiky HAProxy. HAProxy funguje úspěšně a funguje jako vyvažovač zatížení pro dva webové servery Nginx.
Závěr
HAProxy nebo High Availability proxy je software s otevřeným zdrojovým kódem, který poskytuje vysokou dostupnost pro služby založené na TCP, funguje jako vyrovnávání zatížení HTTP a proxy server. Tento software je napsán v jazyce C a podporuje SSL, keep-alive a kompresi. HAProxy je správnou volbou pro každého, kdo potřebuje nástroj pro vyrovnávání zátěže a proxy server, který je rychlý a lehký, má malé nároky na paměť a nízké využití CPU. Haproxy může běžet v režimu Layer 4 TCP a Layer 7 HTTP. Nginx podporuje pouze režim HTTP Layer 7 s HAProxy. Pokud chcete použít režim TCP na 4. vrstvě, můžete použít jiné webové servery, jako je Apache. Na RHEL 8 / CentOS 8 Linux je HAProxy k dispozici ve výchozím úložišti. Snadno se instaluje a konfiguruje.