Hoe te instellen HAProxy als load balancer voor Nginx op CentOS 8

Om maximale beschikbaarheid, schaalbaarheid en hoge prestaties van webapplicaties te garanderen, is het tegenwoordig gebruikelijk om technologieën te implementeren die redundantie introduceren, zoals serverclustering en load balancing. Bijvoorbeeld door een cluster van servers op te zetten die allemaal dezelfde applicatie(s) uitvoeren en vervolgens load balancers ervoor te implementeren om het verkeer te verdelen.

HAProxy is een open-source, krachtige, zeer prestatiegerichte, betrouwbare, veilige en veelgebruikte load balancer, proxyserver en SSL/TLS-terminator voor zeer drukke websites. Het draait betrouwbaar op Linux, Solaris, FreeBSD, OpenBSD, evenals AIX-besturingssystemen.

Deze handleiding laat zien hoe je een toegewijde load balancer met hoge beschikbaarheid opzet met HAProxy op CentOS 8 om het verkeer in een cluster van NGINX webservers te regelen. Het toont ook hoe je SSL/TLS-terminatie configureert in HAProxy.

Vereisten:

A total of 4 servers with minimal CentOS 8 installation.

Opzetten van testomgeving

----------- HAProxy Server Setup ----------- 
HA Proxy Server - hostname: haproxy-server.tecmint.lan; IP: 10.42.0.247
Test Site Domain: www.tecmint.lan


----------- Client Web Servers Setup ----------- 
Web Server #1 - hostname: websrv1.tecmint.lan; IP: 10.42.0.200
Web Server #2 - hostname: websrv2.tecmint.lan; IP: 10.42.0.21
Web Server #3 - hostname: websrv3.tecmint.lan; IP: 10.42.0.34

Stap 1: Nginx HTTP-server instellen op de clientmachines

1.Log in op al uw CentOS 8 clientmachines en installeer de Nginx webserver met behulp van de dnf-pakketbeheerder zoals getoond.

# dnf install Nginx

2. Start vervolgens de Nginx-service, schakel deze voorlopig in om automatisch te starten bij het opstarten van het systeem en bevestig dat deze actief is door de status te controleren met behulp van de systemctl-commando’s (doe dit op alle clientmachines).

# systemctl start nginx
# systemctl enable nginx
# systemctl status nginx

3. Als de firewalld-service op alle clientmachines actief is (wat u kunt controleren door systemctl start firewalld uit te voeren), moet u de HTTP– en HTTPS-services toevoegen in de firewall-configuratie om verzoeken van de load balancer door te laten naar de Nginx-webservers. Herlaad vervolgens de firewalld-service om de nieuwe wijzigingen door te voeren (doe dit op alle clientmachines).

# firewall-cmd --zone=public --permanent --add-service=http
# firewall-cmd --zone=public --permanent --add-service=https
# firewall-cmd --reload

4. Open vervolgens een webbrowser op uw lokale machines en test of de Nginx-installatie goed werkt. Gebruik de IP-adressen van de client om te navigeren, zodra u de testpagina van Nginx ziet, betekent dit dat de webserver correct is geïnstalleerd op de clientmachine.

Test Nginx Installation on All CentOS 8 Client Machines

5. Vervolgens moeten we testpagina’s maken op de clientmachines die we later zullen gebruiken om de HAProxy-configuratie te testen.

----------- Web Server #1 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv1.tecmint.lan"> /usr/share/nginx/html/index.html

----------- Web Server #2 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv2.tecmint.lan"> /usr/share/nginx/html/index.html

----------- Web Server #3 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv3.tecmint.lan"> /usr/share/nginx/html/index.html

Stap 2: HAProxy-server installeren en configureren op CentOS 8

6. Installeer nu het HAProxy-pakket op de HAProxy-server door het volgende commando uit te voeren.

# dnf install haproxy

7. Start vervolgens de HAProxy-service, schakel in om automatisch op te starten bij het opstarten van het systeem en controleer de status.

# systemctl start haproxy
# systemctl enable haproxy
# systemctl status haproxy
Verify HAProxy Status in CentOS 8

8. Nu gaan we HAProxy configureren met behulp van het volgende configuratiebestand.

# vi /etc/haproxy/haproxy.cfg

Het configuratiebestand is verdeeld in vier belangrijke secties.

  • globale instellingen – stelt procesbrede parameters in.
  • standaardwaarden – deze sectie stelt standaardparameters in voor alle andere secties na de verklaring ervan.
  • frontend – deze sectie beschrijft een reeks luisterende sockets die clientverbindingen accepteren.
  • Achterkant – deze sectie beschrijft een reeks servers waarmee de proxy verbinding zal maken om inkomende verbindingen door te sturen.

Om de opties onder globale instellingen en standaardwaarden te begrijpen, lees de HAProxy-documentatie (link aan het einde van het artikel). Voor deze handleiding zullen we de standaardwaarden gebruiken.

Configuratie van HAProxy-logboekregistratie

9. Eenmaal geïmplementeerd, speelt HAProxy een belangrijke rol in uw IT-infrastructuur, dus het configureren van logging is een basisvereiste; hiermee kunt u inzicht krijgen in elke verbinding met uw backend-webservers.

De log parameter (gemarkeerd in de volgende schermafbeelding) declareert een wereldwijde Syslog server (zoals rsyslog, de standaard in CentOS) die logboekberichten zal ontvangen. Hier kan meer dan één server worden gedeclareerd.

De standaardconfiguratie wijst naar de localhost (127.0.0.1) en local2 is de standaard faciliteitscode die wordt gebruikt om HAProxy logboekberichten te identificeren onder rsyslog.

HAProxy Default Log Parameter

10. Vervolgens moet je de rsyslog server vertellen hoe hij HAProxy logboekberichten moet ontvangen en verwerken. Open het rsyslog configuratiebestand naar /etc/rsyslog.conf of maak een nieuw bestand aan binnen de /etc/rsyslog.d directory, bijvoorbeeld /etc/rsyslog.d/haproxy.conf.

# vi /etc/rsyslog.d/haproxy.conf

Kopieer en plak de volgende configuratie om logboeken te verzamelen met UDP op de standaardpoort 514.

$ModLoad imudp 
$UDPServerAddress 127.0.0.1 
$UDPServerRun 514 

Voeg ook deze regels toe om rsyslog te instrueren om naar twee afzonderlijke logbestanden te schrijven op basis van de ernst, waar local2 de faciliteitscode is gedefinieerd in de HAProxy-configuratie hierboven.

local2.* 	/var/log/haproxy-traffic.log 
local2.notice 	/var/log/haproxy-admin.log

11. Sla het bestand op en sluit het. Start vervolgens de rsyslog service opnieuw op om de recente wijzigingen toe te passen.

# systemctl restart rsyslog

Configuratie van HAProxy Front-end en Back-ends

12. In deze sectie zullen we demonstreren hoe de front-end en back-end proxies geconfigureerd kunnen worden. Ga terug naar het HAProxy configuratiebestand en pas de standaard front-end en backend secties aan zoals hieronder. We zullen niet ingaan op een gedetailleerde uitleg van elke parameter, je kunt altijd de officiële documentatie raadplegen.

De volgende configuratie definieert een listen sectie die wordt gebruikt om de HAProxy Stats pagina te serveren. De bind parameter koppelt een luisteraar aan een opgegeven IP-adres (* in dit geval voor alle) en poort (9000).

De stats enable instelling activeert de statistiekenpagina die benaderd zal worden met behulp van de URI /stats (d.w.z. http://server_ip:9000/stats).

De stats auth instelling wordt gebruikt om basisverificatie toe te voegen bij het benaderen van de pagina (vervang haproxy en Lostp@1ss door een gebruikersnaam en wachtwoord naar keuze).

listen stats
    bind *:9000
    stats enable
    stats hide-version
    stats uri /stats
    stats admin if LOCALHOST
    stats auth haproxy:Lostp@1ss

13. De volgende configuratie definieert een front-end sectie genaamd TL (je kunt een naam naar keuze geven). De mode parameter definieert de modus waarin HAProxy opereert.

De acl (Toegangscontrolelijst) parameter wordt gebruikt om een beslissing te nemen op basis van inhoud die uit het verzoek is gehaald. In dit voorbeeld wordt het verzoek als gewone HTTP beschouwd als het niet over SSL is gemaakt.

Vervolgens wordt de instelling http-request set-header gebruikt om een HTTP-header aan het verzoek toe te voegen. Dit helpt om Nginx te informeren dat het initiële verzoek over HTTP is gemaakt (of via poort 80).

De richtlijn default_backend of use_backend definieert de backend-servers, in dit geval verwezen door TL_web_servers.

Let op dat HAProxy een “503 Service Unavailable error” zal teruggeven als een verzoek niet door een use_backend of default_backend richtlijn wordt gerouteerd.

frontend TL
    bind *:80
    mode http
    acl http  ssl_fc,not
    http-request set-header X-Forwarded-Protocol http if http
    default_backend TL_web_servers

14. Dan moeten we een backend-sectie definiëren waar de instelling balance bepaalt hoe HAProxy de back-end servers selecteert om een verzoek te verwerken als geen persistentiemethode die selectie overschrijft.

De richtlijn cookie maakt cookie-gebaseerde persistentie mogelijk, het instrueert HAProxy om een cookie genaamd SERVERID naar de cliënt te sturen en te associëren met de ID van de server die de initiële respons gaf.

De server richtlijn wordt gebruikt om de upstream servers te definiëren in het formaat server_naam (bijv websrv1), server_IP:poort en opties.

Een belangrijke optie is check die HAProxy vertelt om de beschikbaarheid van een server te blijven controleren en hierover te rapporteren op de statistiekenpagina.

backend TL_web_servers
    mode http
    balance roundrobin
    option  httpchk HEAD /
    cookie SERVERUID insert indirect nocache
    server  websrv1 10.42.0.200:80 cookie websrv1 check
    server  websrv2 10.42.0.21:80  cookie websrv2 check
    server  websrv3 10.42.0.34:80  cookie websrv3 check

Commentarieer eventuele andere frontend en backend secties uit zoals getoond in de screenshot die volgt. Sla het bestand op en sluit het.

Configuring HAProxy Front-end and Back-ends

15. Start nu de HAProxy service opnieuw op om de nieuwe wijzigingen toe te passen.

# systemctl restart haproxy

16. Zorg er vervolgens voor dat de HTTP (poort 80) en HTTPS (poort 433) services geopend zijn in de firewall om clientverzoeken te accepteren zoals hieronder weergegeven. Open ook poort 9000 in de firewall om toegang te krijgen tot de statistiekenpagina en herlaad de firewallinstellingen.

# firewall-cmd --zone=public --permanent --add-service=http
# firewall-cmd --zone=public --permanent –add-service=https
# firewall-cmd --zone=public --permanent --add-port=9000/tcp
# firewall-cmd --reload

Stap 3: HAProxy-setup testen en statistieken bekijken

17. Het is nu tijd om de HAPrxoy setup te testen. Voeg op de lokale desktopmachine waarvandaan je alle servers benadert, de volgende regel toe in het bestand /etc/hosts om ons in staat te stellen het dummy domein van de site te gebruiken.

10.42.0.247  www.tecmint.lan

18. Open vervolgens een browser en navigeer met behulp van het serveradres of de domeinnaam van de site.

http://10.42.0.247/
OR
http://www.tecmint.lan/
Check HAProxy Setup

19. Om toegang te krijgen tot de HAProxy statistiekenpagina, gebruik het volgende adres.

http://10.42.0.247:9000/stats

Gebruik vervolgens de gebruikersnaam en het wachtwoord dat je hebt gedefinieerd in het HAProxy-configuratiebestand (zie de stats auth parameter).

HAProxy Stats Login Page

Na een succesvolle login, kom je terecht op de statistiekenpagina van HAProxy die je gegevens laat zien die de gezondheid van je servers, huidige verzoektarieven, responstijden, en nog veel meer omvatten.

Om te demonstreren hoe het statusrapport werkt met betrekking tot de kleurcodes, hebben we een van de back-end servers geplaatst.

HAProxy Statistics Report

Stap 4: Het configureren van HTTPS in HAProxy met behulp van een zelfondertekend SSL-certificaat

20. In dit laatste gedeelte zullen we demonstreren hoe je SSL/TLS configureert om alle communicatie tussen de HAProxy-server en de client te beveiligen. HAProxy ondersteunt vier belangrijke HTTPS configuratiemodi, maar voor deze handleiding zullen we SSL/TLS offloading gebruiken.

In SSL/TLS offloading modus, ontcijfert HAProxy het verkeer aan de kant van de client en maakt verbinding met de back-end servers in helder verkeer.

We zullen beginnen met het maken van het certificaat en de sleutel zoals getoond (beantwoord de vragen dienovereenkomstig op basis van de bedrijfsgegevens tijdens het maken van het certificaat, zoals aangegeven op de schermafbeelding).

# mkdir /etc/ssl/tecmint.lan
# cd /etc/ssl/tecmint.lan/
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/tecmint.lan.key -out /etc/ssl/tecmint.lan.crt
# cd /etc/ssl/tecmint.lan/
# cat tecmint.crt tecmint.key >tecmint.pem
# ls -l
Create SSL for HAProxy

21. Vervolgens, open het configuratiebestand van HAProxy (/etc/haproxy/haproxy.cfg) en bewerk het front-end gedeelte.

frontend TL
    bind *:80
    bind *:443 ssl crt /etc/ssl/tecmint.lan/tecmint.pem
    redirect  scheme  https  if  !{ ssl_fc }
    mode http
    acl http  ssl_fc,not
    acl https ssl_fc
    http-request set-header X-Forwarded-Protocol http if http
    http-request set-header X-Forwarded-Protocol https if https
    default_backend TL_web_servers
Configure HAProxy Front-end with SSL

Sla het bestand op en sluit het.

22. Herstart dan de HAProxy-service om de nieuwe wijzigingen toe te passen.

# systemctl restart haproxy.service

23. Open vervolgens een webbrowser en probeer de site opnieuw te openen. De browser zal een foutmelding tonen vanwege het zelfondertekende certificaat, klik op Geavanceerd om door te gaan.

HAProxy SSL Connection Error
Proceed with Connection
Access Site Over HTTPS

Dat is alles voor nu! Elke webapplicatie heeft zijn eigen set vereisten, je moet load balancing ontwerpen en configureren om aan te sluiten bij je IT-infrastructuur en de vereisten van de applicatie.

Om meer inzicht te krijgen in enkele van de configuratieopties die in deze handleiding worden gebruikt, en over het algemeen hoe je HAProxy kunt gebruiken, zie de officiële HAProxy community-editie documentatie of de HAProxy enterprise versie documentatie. Je kunt eventuele vragen of gedachten posten via het feedbackformulier hieronder.

Source:
https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/