Sådan konfigureres HAProxy-logning med Rsyslog på CentOS 8 [Quickstart]

Introduktion

HAProxy, som står for High Availability Proxy, er en udbredt TCP- og HTTP-baseret proxyserver, der kører på Linux, Solaris og FreeBSD. Den bruges til at lastbalancere programmer ved at fordele anmodninger mellem flere servere og til at sikre, at programmerne er meget tilgængelige for brugerne.

Som standard på mange CentOS 8-installationer er HAProxy ikke konfigureret til at skrive sit logoutput til en fil. Denne quickstart-vejledning forklarer, hvordan du konfigurerer HAProxy-logning med Rsyslog ved at bruge en Unix-domænesocket for at opnå pålidelighed, hastighed og sikkerhed.

Forudsætninger

For at gennemføre denne vejledning skal du bruge en server, der kører CentOS 8. Denne server skal have en ikke-root-bruger med administrative rettigheder. Følg vejledningen Initial Server Setup guide for CentOS 8 tutorial for at konfigurere denne.

Stræk 1 – Installation og aktivering af HAProxy

For at installere HAProxy skal du køre følgende dnf kommando:

  • sudo dnf install haproxy

Når du bliver bedt om Is this ok : at indtaste y og trykke på RETURN for at installere pakken.

Når du har installeret HAProxy, skal du aktivere og starte den ved hjælp af systemctl-kommandoen:

  • sudo systemctl enable haproxy.service

Du bør få følgende output:

Output
Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.

Med HAProxy-tjenesten nu aktiveret kan du starte den for at sikre, at den kører med en standardkonfiguration på din server:

  • sudo systemctl start haproxy.service

Næst skal du undersøge HAProxys status for at sikre, at den kører:

  • sudo systemctl status haproxy.service

Du bør modtage output som det følgende:

  • sudo systemctl status haproxy.service

Du bør modtage output som det følgende:

Output
Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.

Du kan starte HAProxy-tjenesten for at sikre, at den kører med en standardkonfiguration på din server. Bemærk den fremhævede active (running)-del af outputtet. Hvis din server viser den samme fremhævede del, kører HAProxy korrekt på din server, og du kan fortsætte med at konfigurere logning.

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

Hvis dit output er anderledes, eller hvis status viser noget i retning af Active: failed, skal du følge fejlfindingstaksterne i vejledningen Sådan løser du almindelige HAProxy-fejl for at finde ud af, hvad der forhindrer HAProxy i at starte korrekt.

Når du har bekræftet, at HAProxy er aktiveret og kører, kan du gå videre til næste trin, som er at konfigurere HAProxys logningsdirektiver.

Strin 2 – Konfigurering af HAProxy-logningsdirektiver

For at konfigurere HAProxys logningsdirektiver skal du åbne /etc/haproxy/haproxy.cfg i vi eller din foretrukne editor:

  • sudo vi /etc/haproxy/haproxy.cfg

Tryk på i for at skifte til INSERT-tilstand, find derefter linjen log 127.0.0.1 local2 og udkommenter den ved at tilføje et #-tegn i begyndelsen af linjen, som fremhævet i følgende eksempel:

/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. . .

Føj nu en linje direkte efter den udkommenterede linje med følgende indhold:

 log /dev/log local0

Hele det afsnit i /etc/haproxy/haproxy.cfg, som du redigerede, bør indeholde følgende linjer:

/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. . .

Den chroot linje er vigtig, fordi den begrænser HAProxy-processen til kun at få adgang til filer i mappen /var/lib/haproxy. Linjen log /dev/log local0 opretter en fil i denne mappe, som Rsyslog vil bruge til at indsamle logposter fra.

Når du er færdig med at redigere log-linjerne i /etc/haproxy/haproxy.cfg, skal du gemme og lukke filen ved at trykke på ESC, skrive :wq og trykke på ENTER.

Det sidste trin, som du skal gennemføre i dette afsnit, er at oprette mappen /var/lib/haproxy/dev, da den ikke findes som standard.

Opret mappen ved hjælp af kommandoen mkdir, og genstart derefter HAProxy:

  • sudo mkdir /var/lib/haproxy/dev
  • sudo systemctl restart haproxy.service

Du har nu konfigureret HAProxy til at sende sine logfiler til en Unix-domænesocket, der ligger i /var/lib/haproxy/dev/log. I det næste trin konfigurerer du Rsyslog til at oprette og få adgang til socket’en.

Stræk 3 – Konfigurering af Rsyslog til at indsamle HAProxy-logs

Rsyslogs standardkonfiguration på CentOS 8 håndterer ikke HAProxy-logs. For at indsamle logs fra HAProxy-tjenesten skal du åbne en ny fil /etc/rsyslog.d/99-haproxy.conf ved hjælp af vi eller din foretrukne editor:

  • sudo vi /etc/rsyslog.d/99-haproxy.conf

Tryk på i for at skifte til INSERT-tilstand, og indsæt derefter følgende linjer i filen:

/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}

Direktivet $AddUnixListenSocket fortæller Rsyslog, at det skal oprette en Unix-domæne-socket på den angivne placering, i dette tilfælde /var/lib/haproxy/dev/log. Afsnittet :programname, startswith, "haproxy" angiver den fil, hvor Rsyslog skal skrive de logposter til, som den indsamler fra socket.

Når du er færdig med at redigere /etc/rsyslog.d/99-haproxy.conf, skal du gemme og lukke filen ved at trykke på ESC, skrive :wq og trykke på ENTER.

Du har nu konfigureret Rsyslog til at læse logposter fra Unix-domænesocket’en i /var/lib/haproxy/dev/log og skrive dem til en logfil i /var/log/haproxy.log.

Hvor du genstarter Rsyslog, skal du imidlertid fastslå, om SELinux håndhæver adgangskontrol på dit CentOS 8-system.

For at kontrollere SELinux’ aktuelle politik skal du køre følgende:

  • getenforce

Du vil modtage et af følgende output:

  • Enforcing – I denne tilstand håndhæver SELinux adgangskontrol på dit system. Du skal udfylde følgende valgfrie afsnit Trin 4 – Konfiguration af SELinux.
  • Permissive – I dette tilfælde logger SELinux alle adgangsforsøg i logfilen, men håndhæver ikke adgangskontrol på dit system.
  • Disabled – Hvis SELinux er deaktiveret, logger eller håndhæver den ikke nogen adgangskontrolpolitik på dit system.

Hvis kommandoen getenforce returnerede enten Permissive eller Disabled, kan du genstarte Rsyslog med følgende kommando:

  • sudo systemctl restart rsyslog

Når du har genstartet Rsyslog, kan du se logfiler i filen /var/log/haproxy.log, som du konfigurerede i /etc/rsyslog.d/99-haproxy.conf. Fortsæt til trin 5 – Test af HAProxy-logning for at sikre dig, at alt fungerer som forventet.

Hvis dit system kører SELinux i Enforcing-tilstand, forklares det i næste afsnit af denne vejledning, hvordan du tilføjer et modul, så Rsyslog og HAProxy kan kommunikere med hinanden over deres fælles Unix-domænesocket.

Stræk 4 – (Valgfrit) Konfigurering af SELinux

Hvis dit CentOS 8-system er konfigureret med SELinux i Enforcing-tilstand, skal du give Rsyslog adgang til HAProxys chroot-mappe. Hvis du tillader denne adgang, vil Rsyslog kunne oprette den Unix-domænesocket, som HAproxy sender sine logfiler til.

Hvis du ikke er bekendt med SELinux, vil denne vejledningsserie An Introduction to SELinux on CentOS 7 hjælpe dig med at lære, hvordan du administrerer og interagerer med SELinux. Selv om den er skrevet til CentOS 7, er principperne og kommandoerne i serien lige så anvendelige på CentOS 8.

For at aktivere Rsyslog og HAProxy adgang til deres delte socket, er den første opgave at oprette en Type Enforcement-politikfil. Åbn en ny fil med navnet rsyslog-haproxy.te i vi eller din foretrukne editor:

  • vi rsyslog-haproxy.te

Tryk på i for at skifte til INSERT-tilstand, og indsæt derefter følgende linjer i filen:

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 };

Den første linje definerer modulets navn og version. require-delen fortæller SELinux-modulindlæser om de typer og klasser, der er nødvendige for, at politikken kan indlæses som et modul. De to sidste linjer er de regler, der tillader Rsyslog-adgang til henholdsvis HAProxys chroot– og socketfil.

Når du er færdig med at redigere filen, skal du gemme og lukke den ved at trykke på ESC, skrive :wq og trykke på ENTER.

Dernæst skal du køre følgende kommando for at installere pakken checkpolicy, som indeholder værktøjet checkmodule, som du skal bruge til at omdanne filen Type Enforcement til et SELinux-modul.

  • sudo dnf install checkpolicy

Nu, hvor du har installeret værktøjet checkmodule, er det næste skridt at kompilere modulet og derefter indlæse det i SELinux. Kør følgende for at kompilere filen Type Enforcement til et SELinux-modul:

  • checkmodule -M -m rsyslog-haproxy.te -o rsyslog-haproxy.mod

Kør derefter semodule_package for at generere en komplet politikpakke, som SELinux kan indlæse i Linux-kernen:

  • semodule_package -o rsyslog-haproxy.pp -m rsyslog-haproxy.mod

Det sidste trin er at indlæse den pakke, du genererede, i Linux-kernen ved hjælp af kommandoen semodule:

  • sudo semodule -i rsyslog-haproxy.pp

Indlæsning af modulet kan tage et par sekunder. Når kommandoen er færdig, kan du bekræfte, at modulet er indlæst i kernen ved at køre kommandoen semodule:

  • sudo semodule -l |grep rsyslog-haproxy

Du bør modtage output som følgende:

Output
rsyslog-haproxy

Når modulet er indlæst, kan du genstarte Rsyslog med følgende kommando:

  • sudo systemctl restart rsyslog

Du har nu defineret, kompileret og indlæst en SELinux-politik, der giver HAProxy og Rsyslog mulighed for at kommunikere over deres fælles socket.

I næste trin skal du teste, at alt fungerer ved at lave en HTTP-forespørgsel til HAProxy og undersøge dens nye logfil.

Strin 5 – Test af HAProxy-logning

Nu, hvor du har konfigureret HAProxy, Rsyslog og eventuelt SELinux, kan du teste, at logning til /var/log/haproxy.log fungerer.

Som standard leveres haproxy-pakken med en konfigurationsfil, der opretter en HTTP-lytter socket på port 5000. Konfigurationen peger på en ikke-eksisterende backend-server, så enhver anmodning til porten vil resultere i en HTTP 503-fejl.

For at kontrollere, om der er en 503-fejl i din /var/log/haproxy.log-fil, skal du først generere en HTTP-anmodning ved hjælp af curl på denne måde:

  • curl -si http://127.0.0.1:5000

Du bør modtage output som det følgende:

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>

Undersøg nu /var/log/haproxy.log for eventuelle HTTP 503-svar ved hjælp af kommandoen grep:

  • sudo grep -E 'NOSRV.+503' /var/log/haproxy.log

Bemærk: NOSRV.+503-delen af kommandoen er et regulært udtryk. Denne vejledning om Brug af Grep & regulære udtryk til at søge efter tekstmønstre i Linux
går mere i dybden med brugen af grep og regulære udtryk.

Du bør modtage en linje (eller flere linjer) som følgende:

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"

Denne linje svarer til den curl-anmodning, du foretog, hvilket betyder, at Rsyslog og HAProxy er konfigureret til at bruge deres fælles socket korrekt.

Slutning

I denne quickstart-vejledning konfigurerede du HAProxy til at logge til en Unix-domænesocket. Du konfigurerede også Rsyslog til at oprette og læse fra socket’en, så de to programmer kan kommunikere med hinanden uden at åbne nogen TCP/IP-porte på dit system. Endelig kompilerede, pakkede og indlæste du valgfrit en SELinux-politik for at give Rsyslog og HAProxy fælles adgang til deres socket.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.