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:
OutputCreated 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:
OutputCreated 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:
. . .# 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:
. . .# 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:
$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:
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:
Outputrsyslog-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:
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>
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:
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"
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.