Inleiding
HAProxy, dat staat voor High Availability Proxy, is een veelgebruikte op TCP en HTTP gebaseerde proxyserver die draait op Linux, Solaris en FreeBSD. Het wordt gebruikt om applicaties te load balanceren door verzoeken te verdelen over meerdere servers, en om ervoor te zorgen dat applicaties zeer beschikbaar zijn voor gebruikers.
Op veel CentOS 8 installaties is HAProxy standaard niet geconfigureerd om zijn log output naar een bestand te schrijven. Deze snelstart-tutorial legt uit hoe u HAProxy-logging met Rsyslog kunt configureren door gebruik te maken van een Unix-domein socket voor betrouwbaarheid, snelheid en beveiliging.
Voorvereisten
Om deze tutorial te voltooien, hebt u een server nodig waarop CentOS 8 draait. Deze server moet een niet-root gebruiker hebben met beheerdersrechten. Om deze op te zetten, volgt u de handleiding Eerste serverinstallatie voor CentOS 8.
Stap 1 – HAProxy installeren en inschakelen
Om HAProxy te installeren, voert u het volgende dnf
commando uit:
- sudo dnf install haproxy
Wanneer u Is this ok :
wordt gevraagd, voert u y
in en drukt u op RETURN
om het pakket te installeren.
Nadat u HAProxy hebt geïnstalleerd, schakelt u het in en start u het met het systemctl
commando:
- sudo systemctl enable haproxy.service
U zou de volgende uitvoer moeten krijgen:
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
Met de HAProxy service nu ingeschakeld, kunt u het starten om ervoor te zorgen dat het draait met een standaard configuratie op uw server:
- sudo systemctl start haproxy.service
Naar aanleiding hiervan onderzoekt u de status van HAProxy om ervoor te zorgen dat het draait:
- sudo systemctl status haproxy.service
U zou output moeten krijgen zoals de volgende. Let op het gemarkeerde active (running)
gedeelte van de uitvoer. Als uw server hetzelfde gemarkeerde gedeelte toont, dan draait HAProxy correct op uw server en kunt u doorgaan met het configureren van logging.
Output● haproxy.service - HAProxy Load Balancer Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2020-09-09 21:16:39 UTC; 4min 39s ago Process: 21340 ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q (code=exited, status=0/SUCCESS) Main PID: 21341 (haproxy) Tasks: 2 (limit: 2881) Memory: 2.7M CGroup: /system.slice/haproxy.service ├─21341 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid. . .
Als uw uitvoer anders is, of de status toont iets als Active: failed
, volg dan de stappen voor het oplossen van problemen in de Hoe HAProxy Fouten Oplossen handleiding om te bepalen wat HAProxy verhindert om correct te starten.
Als u eenmaal heeft bevestigd dat HAProxy is ingeschakeld en werkt, kunt u verder gaan met de volgende stap, het configureren van HAProxy’s logging directives.
Stap 2 – Het configureren van HAProxy Logging Directives
Om HAProxy’s logging directives te configureren, opent u /etc/haproxy/haproxy.cfg
in vi
of een editor naar keuze:
- sudo vi /etc/haproxy/haproxy.cfg
Druk op i
om over te schakelen naar INSERT
modus, zoek dan de regel log 127.0.0.1 local2
en geef het commentaar door een #
teken toe te voegen aan het begin van de regel, zoals in het volgende voorbeeld:
. . .# 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. . .
Neem nu een regel direct na de uitgecommentarieerde regel met de volgende inhoud:
log /dev/log local0
De gehele sectie van /etc/haproxy/haproxy.cfg
die u bewerkt heeft zou de volgende regels moeten bevatten:
. . .# local2.* /var/log/haproxy.log# #log 127.0.0.1 local2 log /dev/log local0 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid. . .
De chroot
regel is belangrijk, omdat het het HAProxy proces beperkt tot toegang tot bestanden in de /var/lib/haproxy
directory. De log /dev/log local0
regel zal een bestand in die directory maken dat Rsyslog zal gebruiken om log entries van te verzamelen.
Als u klaar bent met het bewerken van de log
regels in /etc/haproxy/haproxy.cfg
, slaat u het bestand op en sluit u het door op ESC
te drukken, :wq
te typen, en op ENTER
te drukken.
De laatste stap die u in deze sectie moet uitvoeren is het aanmaken van de /var/lib/haproxy/dev
directory, omdat deze standaard niet bestaat.
Maak de directory aan met het mkdir
commando en herstart dan HAProxy:
- sudo mkdir /var/lib/haproxy/dev
- sudo systemctl restart haproxy.service
U heeft nu HAProxy geconfigureerd om zijn logs naar een Unix domain socket te sturen die zich in /var/lib/haproxy/dev/log
bevindt. In de volgende stap configureert u Rsyslog om de socket aan te maken en te benaderen.
Stap 3 – Rsyslog configureren om HAProxy logs te verzamelen
Rsyslog’s standaard configuratie op CentOS 8 kan niet overweg met HAProxy logs. Om logs van de HAProxy service te verzamelen, opent u een nieuw bestand /etc/rsyslog.d/99-haproxy.conf
met vi
of uw favoriete editor:
- sudo vi /etc/rsyslog.d/99-haproxy.conf
Druk op i
om over te schakelen naar INSERT
modus, plak dan de volgende regels in het bestand:
$AddUnixListenSocket /var/lib/haproxy/dev/log# Send HAProxy messages to a dedicated logfile:programname, startswith, "haproxy" { /var/log/haproxy.log stop}
De $AddUnixListenSocket
directive vertelt Rsyslog om een Unix domain socket aan te maken op de gespecificeerde lokatie, in dit geval /var/lib/haproxy/dev/log
. De :programname, startswith, "haproxy"
sectie specificeert het bestand waar Rsyslog de log gegevens naar zal schrijven die het van de socket verzamelt.
Als U klaar bent met het bewerken van /etc/rsyslog.d/99-haproxy.conf
, slaat U het bestand op en sluit het door op ESC
te drukken, :wq
te typen, en op ENTER
te drukken.
U heeft nu Rsyslog geconfigureerd om log gegevens te lezen van de Unix domain socket in /var/lib/haproxy/dev/log
en ze te schrijven naar een log bestand in /var/log/haproxy.log
.
Voordat u Rsyslog opnieuw start, moet u echter bepalen of SELinux toegangscontrole afdwingt op uw CentOS 8 systeem.
Om het huidige beleid van SELinux te controleren, voert u het volgende uit:
- getenforce
U ontvangt een van de volgende uitvoerberichten:
-
Enforcing
– In deze modus dwingt SELinux toegangscontrole af op uw systeem. U moet de volgende optionele sectie Stap 4 – SELinux configureren uitvoeren. -
Permissive
– In dit geval logt SELinux alle toegangspogingen naar het logbestand, maar dwingt het geen toegangscontroles af op uw systeem. -
Disabled
– Als SELinux is uitgeschakeld, logt het geen toegangscontrolebeleid op uw systeem en dwingt het deze ook niet af.
Als het getenforce
commando Permissive
of Disabled
teruggaf, kunt u Rsyslog opnieuw starten met het volgende commando:
- sudo systemctl restart rsyslog
Als u Rsyslog opnieuw start, kunt u de logs bekijken in het /var/log/haproxy.log
bestand dat u configureerde in /etc/rsyslog.d/99-haproxy.conf
. Ga verder met Stap 5 – Testen van HAProxy Logging om er zeker van te zijn dat alles werkt zoals verwacht.
Ofwel, als uw systeem SELinux draait in Enforcing
mode, dan legt de volgende sectie van deze tutorial uit hoe een module toe te voegen om Rsyslog en HAProxy met elkaar te laten communiceren via hun gedeelde Unix domain socket.
Stap 4 – (Optioneel) SELinux configureren
Als uw CentOS 8 systeem is geconfigureerd met SELinux in Enforcing
modus, dan moet u Rsyslog toegang geven tot HAProxy’s chroot
directory. Door deze toegang toe te staan kan Rsyslog de Unix domain socket aanmaken waar HAproxy zijn logs naartoe stuurt.
Als u niet bekend bent met SELinux, zal deze tutorial serie An Introduction to SELinux on CentOS 7 u helpen te leren hoe u SELinux kunt beheren en ermee kunt werken. Hoewel het is geschreven voor CentOS 7, zijn de principes en commando’s in de serie evenzeer van toepassing op CentOS 8.
Om Rsyslog en HAProxy toegang te geven tot hun gedeelde socket, is de eerste taak het maken van een Type Enforcement beleidsbestand. Open een nieuw bestand genaamd rsyslog-haproxy.te
in vi
of uw favoriete editor:
- vi rsyslog-haproxy.te
Druk op i
om over te schakelen naar INSERT
modus, plak dan de volgende regels in het bestand:
module rsyslog-haproxy 1.0;require { type syslogd_t; type haproxy_var_lib_t; class dir { add_name remove_name search write }; class sock_file { create setattr unlink };}#============= syslogd_t ==============allow syslogd_t haproxy_var_lib_t:dir { add_name remove_name search write };allow syslogd_t haproxy_var_lib_t:sock_file { create setattr unlink };
De eerste regel definieert de module naam en versie. Het require
gedeelte vertelt de SELinux module loader over de types en klassen die nodig zijn om de policy als een module te laden. De laatste twee regels zijn de regels die Rsyslog toegang geven tot respectievelijk HAProxy’s chroot
en socket file.
Wanneer u klaar bent met het bewerken van het bestand, slaat u het op en sluit u het door op ESC
te drukken, :wq
in te typen, en op ENTER
te drukken.
Daarnaast voert u het volgende commando uit om het pakket checkpolicy
te installeren, dat het hulpprogramma checkmodule
bevat dat u zult gebruiken om het Type Enforcement-bestand in een SELinux-module te veranderen.
- sudo dnf install checkpolicy
Nu u het hulpprogramma checkmodule
hebt geïnstalleerd, is de volgende stap de module te compileren en vervolgens in SELinux te laden. Voer het volgende uit om het Type Enforcement-bestand in een SELinux-module te compileren:
- checkmodule -M -m rsyslog-haproxy.te -o rsyslog-haproxy.mod
Daarna semodule_package
uitvoeren om een compleet beleidspakket te genereren dat SELinux in de Linux-kernel kan laden:
- semodule_package -o rsyslog-haproxy.pp -m rsyslog-haproxy.mod
De laatste stap is het laden van het pakket dat u in de Linux-kernel hebt gegenereerd met het semodule
commando:
- sudo semodule -i rsyslog-haproxy.pp
Het toevoegen van de module kan een paar seconden duren. Zodra het commando is voltooid, kunt u bevestigen dat de module in de kernel is geladen door het semodule
commando uit te voeren:
- sudo semodule -l |grep rsyslog-haproxy
U zou uitvoer als de volgende moeten krijgen:
Outputrsyslog-haproxy
Als de module is geladen, kunt u Rsyslog opnieuw starten met het volgende commando:
- sudo systemctl restart rsyslog
U hebt nu een SELinux beleid gedefinieerd, gecompileerd en geladen dat HAProxy en Rsyslog in staat zal stellen om te communiceren via hun gedeelde socket.
In de volgende stap zult u testen of alles werkt door een HTTP verzoek aan HAProxy te doen en het nieuwe logbestand te onderzoeken.
Stap 5 – Testen van HAProxy Logging
Nu u HAProxy, Rsyslog, en optioneel SELinux heeft geconfigureerd, kunt u testen of het loggen naar /var/log/haproxy.log
werkt.
Het haproxy
pakket wordt standaard geleverd met een configuratiebestand dat een HTTP listener socket op poort 5000 aanmaakt. De configuratie wijst naar een niet-bestaande backend server, dus elk verzoek naar de poort zal resulteren in een HTTP 503 foutmelding.
Om te controleren op een 503 fout in uw /var/log/haproxy.log
bestand, genereert u eerst een HTTP verzoek met curl
zoals dit:
- curl -si http://127.0.0.1:5000
U zou uitvoer moeten krijgen zoals het volgende:
OutputHTTP/1.0 503 Service UnavailableCache-Control: no-cacheConnection: closeContent-Type: text/html<html><body><h1>503 Service Unavailable</h1>No server is available to handle this request.</body></html>
Nu onderzoekt u /var/log/haproxy.log
op HTTP 503 antwoorden met het grep
commando:
- sudo grep -E 'NOSRV.+503' /var/log/haproxy.log
Note: Het NOSRV.+503
gedeelte van het commando is een reguliere expressie. Deze tutorial over het gebruik van Grep & reguliere expressies om naar tekstpatronen te zoeken in Linux
gaat dieper in op het gebruik van grep
en reguliere expressies.
U zou een regel (of meerdere regels) als de volgende moeten ontvangen:
OutputSep 9 21:32:22 centos-s-1vcpu-1gb-nyc3-01 haproxy: 127.0.0.1:56024 main app/<NOSRV> 0/-1/-1/-1/0 503 212 - - SC-- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
Deze regel komt overeen met het curl
verzoek dat u hebt gedaan, wat betekent dat Rsyslog en HAProxy zijn geconfigureerd om hun gedeelde socket correct te gebruiken.
Conclusie
In deze snelstart-tutorial hebt u HAProxy geconfigureerd om te loggen op een Unix-domein socket. Je hebt ook Rsyslog ingesteld om de socket aan te maken en te lezen, zodat de twee programma’s met elkaar kunnen communiceren zonder TCP/IP poorten op je systeem te openen. Tenslotte hebt u optioneel een SELinux policy gecompileerd, verpakt en geladen om Rsyslog en HAProxy gedeelde toegang tot hun socket te geven.