Hoe HAProxy-logging configureren met Rsyslog op CentOS 8 [Quickstart]

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:

Output
Created 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:

/etc/haproxy/haproxy.cfg
. . .# 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:

/etc/haproxy/haproxy.cfg
. . .# 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:

/etc/rsyslog.d/99-haproxy.conf
$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:

rsyslog-haproxy.te
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:

Output
rsyslog-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:

Output
HTTP/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:

Output
Sep 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.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.