Introduktion
HAProxy, som står för High Availability Proxy, är en allmänt använd TCP- och HTTP-baserad proxyserver som körs på Linux, Solaris och FreeBSD. Den används för att lastbalansera program genom att distribuera förfrågningar mellan flera servrar och för att se till att programmen är högtillgängliga för användarna.
Som standard på många CentOS 8-installationer är HAProxy inte konfigurerad för att skriva sin loggutgång till en fil. Den här snabbstartshandledningen förklarar hur man konfigurerar HAProxy-loggning med Rsyslog genom att använda en Unix domain socket för tillförlitlighet, snabbhet och säkerhet.
Förutsättningar
För att slutföra den här handledningen behöver du en server som kör CentOS 8. Den här servern bör ha en icke-rootanvändare med administratörsrättigheter. För att konfigurera denna följer du guiden Initial Server Setup guide for CentOS 8 tutorial.
Steg 1 – Installera och aktivera HAProxy
För att installera HAProxy kör du följande dnf
kommando:
- sudo dnf install haproxy
När du uppmanas Is this ok :
att ange y
och trycka RETURN
för att installera paketet.
När du har installerat HAProxy aktiverar och startar du det med kommandot systemctl
:
- sudo systemctl enable haproxy.service
Du bör få följande utdata:
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
Med HAProxy-tjänsten nu aktiverad kan du starta den för att se till att den körs med en standardkonfiguration på din server:
- sudo systemctl start haproxy.service
Nästan kan du undersöka HAProxys status för att se till att den körs:
- sudo systemctl status haproxy.service
Du bör få följande utdata. Observera den markerade active (running)
delen av utmatningen. Om din server visar samma markerade avsnitt körs HAProxy korrekt på din server och du kan fortsätta med att konfigurera loggning.
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. . .
Om din utdata är annorlunda, eller om statusen visar något som Active: failed
, ska du följa felsökningsstegen i handledningen Hur man löser vanliga HAProxy-fel för att fastställa vad som hindrar HAProxy från att starta korrekt.
När du har bekräftat att HAProxy är aktiverad och körs kan du fortsätta till nästa steg, som är att konfigurera HAProxys loggningsdirektiv.
Steg 2 – Konfigurera HAProxys loggningsdirektiv
För att konfigurera HAProxys loggningsdirektiv öppnar du /etc/haproxy/haproxy.cfg
i vi
eller din föredragna editor:
- sudo vi /etc/haproxy/haproxy.cfg
Tryck på i
för att växla till INSERT
-läge, hitta sedan raden log 127.0.0.1 local2
och kommentera ut den genom att lägga till ett #
-tecken i början av raden, som markerat i följande exempel:
. . .# 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ör lägg nu till en rad direkt efter den utkommenterade raden med följande innehåll:
log /dev/log local0
Hela avsnittet i /etc/haproxy/haproxy.cfg
som du redigerade bör innehålla följande rader:
. . .# local2.* /var/log/haproxy.log# #log 127.0.0.1 local2 log /dev/log local0 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid. . .
Raden chroot
är viktig eftersom den begränsar HAProxy-processen till att endast komma åt filer i katalogen /var/lib/haproxy
. Linjen log /dev/log local0
skapar en fil i den katalogen som Rsyslog kommer att använda för att samla in loggposter från.
När du är klar med redigeringen av log
-linjerna i /etc/haproxy/haproxy.cfg
sparar och stänger du filen genom att trycka på ESC
, skriva :wq
och trycka på ENTER
.
Det sista steget som du måste slutföra i det här avsnittet är att skapa katalogen /var/lib/haproxy/dev
eftersom den inte finns som standard.
Skapa katalogen med hjälp av kommandot mkdir
och starta sedan om HAProxy:
- sudo mkdir /var/lib/haproxy/dev
- sudo systemctl restart haproxy.service
Du har nu konfigurerat HAProxy så att den skickar sina loggar till en Unix-domänsockett som finns i /var/lib/haproxy/dev/log
. I nästa steg ska du konfigurera Rsyslog för att skapa och få tillgång till sockeln.
Steg 3 – Konfigurera Rsyslog för att samla in HAProxy-loggar
Rsyslogs standardkonfiguration på CentOS 8 hanterar inte HAProxy-loggar. För att samla in loggar från HAProxy-tjänsten öppnar du en ny fil /etc/rsyslog.d/99-haproxy.conf
med hjälp av vi
eller din önskade editor:
- sudo vi /etc/rsyslog.d/99-haproxy.conf
Tryck på i
för att växla till INSERT
-läge och klistra sedan in följande rader 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
säger åt Rsyslog att skapa en Unix domain socket på den angivna platsen, i det här fallet /var/lib/haproxy/dev/log
. Avsnittet :programname, startswith, "haproxy"
anger filen där Rsyslog ska skriva loggposterna till som den samlar in från sockeln.
När du är klar med redigeringen av /etc/rsyslog.d/99-haproxy.conf
sparar och stänger du filen genom att trycka på ESC
, skriva :wq
och trycka på ENTER
.
Du har nu konfigurerat Rsyslog så att den läser loggposter från Unix-domänsockeln i /var/lib/haproxy/dev/log
och skriver dem till en loggfil i /var/log/haproxy.log
.
För att starta om Rsyslog måste du dock fastställa om SELinux upprätthåller åtkomstkontroll på ditt CentOS 8-system.
För att kontrollera SELinux aktuella policy kör du följande:
- getenforce
Du kommer att få en av följande utdata:
-
Enforcing
– I det här läget upprätthåller SELinux åtkomstkontroll på ditt system. Du måste fylla i följande valfria avsnitt Steg 4 – Konfigurera SELinux. -
Permissive
– I det här fallet loggar SELinux alla åtkomstförsök till loggfilen, men upprätthåller inte åtkomstkontroller i systemet. -
Disabled
– Om SELinux är inaktiverat loggar eller upprätthåller SELinux inga åtkomstkontrollpolicyer i systemet.
Om kommandot getenforce
returnerade antingen Permissive
eller Disabled
kan du starta om Rsyslog med följande kommando:
- sudo systemctl restart rsyslog
När du har startat om Rsyslog kan du visa loggar i filen /var/log/haproxy.log
som du konfigurerade i /etc/rsyslog.d/99-haproxy.conf
. Fortsätt till Steg 5 – Testning av HAProxy-loggning för att se till att allt fungerar som förväntat.
Om ditt system kör SELinux i läget Enforcing
förklarar nästa avsnitt av den här handledningen hur du lägger till en modul som gör det möjligt för Rsyslog och HAProxy att kommunicera med varandra över sin delade Unix-domänsockett.
Steg 4 – (Valfritt) Konfigurera SELinux
Om ditt CentOS 8-system är konfigurerat med SELinux i Enforcing
-läge måste du tillåta Rsyslog åtkomst till HAProxys chroot
-katalog. Om du tillåter denna åtkomst kan Rsyslog skapa Unix-domänsockeln som HAproxy skickar sina loggar till.
Om du inte är bekant med SELinux kan du lära dig hur du hanterar och interagerar med SELinux med hjälp av den här handledningsserien An Introduction to SELinux on CentOS 7. Även om den är skriven för CentOS 7 är principerna och kommandona i serien lika tillämpliga på CentOS 8.
För att aktivera Rsyslog- och HAProxy-åtkomst till sin delade socket är den första uppgiften att skapa en principfil för typgenomdrivning. Öppna en ny fil med namnet rsyslog-haproxy.te
i vi
eller din önskade editor:
- vi rsyslog-haproxy.te
Tryck i
för att växla till INSERT
-läge och klistra sedan in följande rader 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örsta raden definierar modulens namn och version. Del require
talar om för SELinux-modulladdaren vilka typer och klasser som krävs för att policyn ska kunna laddas som en modul. De två sista raderna är de regler som tillåter Rsyslog åtkomst till HAProxys chroot
respektive socketfil.
När du är klar med redigeringen av filen sparar och stänger du den genom att trycka på ESC
, skriva :wq
och trycka på ENTER
.
Nästan kör du följande kommando för att installera paketet checkpolicy
, som innehåller verktyget checkmodule
som du kommer att använda för att förvandla filen Type Enforcement till en SELinux-modul.
- sudo dnf install checkpolicy
När du nu har verktyget checkmodule
installerat är nästa steg att kompilera modulen och sedan ladda den i SELinux. Kör följande för att kompilera filen Type Enforcement till en SELinux-modul:
- checkmodule -M -m rsyslog-haproxy.te -o rsyslog-haproxy.mod
Nästan kör du semodule_package
för att generera ett komplett policypaket som SELinux kan ladda in i Linuxkärnan:
- semodule_package -o rsyslog-haproxy.pp -m rsyslog-haproxy.mod
Det sista steget är att ladda in paketet som du genererade i Linuxkärnan med hjälp av semodule
-kommandot:
- sudo semodule -i rsyslog-haproxy.pp
Att lägga till modulen kan ta några sekunder. När kommandot är klart kan du bekräfta att modulen är inläst i kärnan genom att köra kommandot semodule
:
- sudo semodule -l |grep rsyslog-haproxy
Du bör få ett utdata som följande:
Outputrsyslog-haproxy
När modulen är inläst kan du starta om Rsyslog med följande kommando:
- sudo systemctl restart rsyslog
Du har nu definierat, kompilerat och läst in en SELinux-policy som gör det möjligt för HAProxy och Rsyslog att kommunicera över sin delade socket.
I nästa steg ska du testa att allt fungerar genom att göra en HTTP-förfrågan till HAProxy och undersöka dess nya loggfil.
Steg 5 – Testa HAProxy-loggning
Nu när du har konfigurerat HAProxy, Rsyslog och eventuellt SELinux kan du testa att loggning till /var/log/haproxy.log
fungerar.
Som standard levereras haproxy
-paketet med en konfigurationsfil som skapar en HTTP-lyssnarsocket på port 5000. Konfigurationen pekar på en icke-existerande backend-server, så alla förfrågningar till porten kommer att resultera i ett HTTP 503-fel.
För att kontrollera om det finns ett 503-fel i din /var/log/haproxy.log
-fil genererar du först en HTTP-förfrågan med curl
så här:
- curl -si http://127.0.0.1:5000
Du bör få ett utdata som följande:
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ök nu /var/log/haproxy.log
för eventuella HTTP 503-svar med hjälp av grep
-kommandot:
- sudo grep -E 'NOSRV.+503' /var/log/haproxy.log
Notera: NOSRV.+503
-delen av kommandot är ett reguljärt uttryck. Den här handledningen om att använda Grep & Reguljära uttryck för att söka efter textmönster i Linux
går mer på djupet när det gäller att använda grep
och reguljära uttryck.
Du bör få en rad (eller flera rader) som liknar följande:
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"
Denna rad motsvarar curl
-förfrågan som du gjorde, vilket innebär att Rsyslog och HAProxy är konfigurerade för att använda sin delade socket på rätt sätt.
Slutsats
I den här snabbstartshandledningen har du konfigurerat HAProxy så att den loggar till en Unix-domän socket. Du konfigurerade också Rsyslog för att skapa och läsa från sockeln så att de två programmen kan kommunicera med varandra utan att öppna några TCP/IP-portar på ditt system. Slutligen kompilerade, paketerade och laddade du valfritt en SELinux-policy för att ge Rsyslog och HAProxy delad åtkomst till sin socket.