Jak nakonfigurovat protokolování HAProxy pomocí Rsyslog v systému CentOS 8 [Rychlý start]

Úvod

HAProxy, což je zkratka pro High Availability Proxy, je široce používaný proxy server založený na protokolu TCP a HTTP, který běží v systémech Linux, Solaris a FreeBSD. Používá se k vyrovnávání zátěže aplikací rozdělováním požadavků mezi více serverů a k zajištění vysoké dostupnosti aplikací pro uživatele.

V mnoha instalacích systému CentOS 8 není server HAProxy ve výchozím nastavení nakonfigurován tak, aby zapisoval výstup protokolu do souboru. Tento stručný návod vysvětluje, jak nakonfigurovat protokolování serveru HAProxy pomocí protokolu Rsyslog pomocí doménového soketu Unix pro zajištění spolehlivosti, rychlosti a bezpečnosti.

Předpoklady

Pro dokončení tohoto návodu budete potřebovat server se systémem CentOS 8.

Předpoklady

Pro dokončení tohoto návodu budete potřebovat server se systémem CentOS 8. Tento server by měl mít uživatele bez oprávnění roota s právy správce. Pro jeho nastavení postupujte podle návodu Počáteční nastavení serveru pro CentOS 8.

Krok 1 – Instalace a povolení HAProxy

Pro instalaci HAProxy spusťte následující příkaz dnf:

  • sudo dnf install haproxy

Po zobrazení výzvy Is this ok : zadejte y a stiskněte RETURN pro instalaci balíčku.

Po instalaci serveru HAProxy jej povolte a spusťte pomocí příkazu systemctl:

  • sudo systemctl enable haproxy.service

Měli byste obdržet následující výstup:

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

Když je nyní služba HAProxy povolena, můžete ji spustit, abyste se ujistili, že na serveru běží s výchozí konfigurací:

  • sudo systemctl start haproxy.service

Dále zkontrolujte stav služby HAProxy, abyste se ujistili, že běží:

  • sudo systemctl status haproxy.service

Měli byste obdržet následující výstup. Všimněte si zvýrazněné části výstupu active (running). Pokud váš server zobrazuje stejnou zvýrazněnou část, pak je server HAProxy na vašem serveru spuštěn správně a můžete pokračovat v konfiguraci protokolování.

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

Pokud je váš výstup jiný nebo stav zobrazuje něco jako Active: failed, postupujte podle kroků pro řešení problémů v návodu Jak řešit běžné chyby serveru HAProxy, abyste zjistili, co brání správnému spuštění serveru HAProxy.

Pokud máte potvrzeno, že je server HAProxy povolen a spuštěn, můžete pokračovat dalším krokem, kterým je konfigurace směrnic pro protokolování serveru HAProxy.

Krok 2 – Konfigurace směrnic pro protokolování serveru HAProxy

Pro konfiguraci směrnic pro protokolování serveru HAProxy otevřete /etc/haproxy/haproxy.cfg v vi nebo v preferovaném editoru:

  • sudo vi /etc/haproxy/haproxy.cfg

Stisknutím i přepněte do režimu INSERT, poté najděte řádek log 127.0.0.1 local2 a zakomentujte jej přidáním znaku # na začátek řádku, jak je zvýrazněno v následujícím příkladu:

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

Nyní přidejte přímo za zakomentovaný řádek řádek s následujícím obsahem:

 log /dev/log local0

Celá část /etc/haproxy/haproxy.cfg, kterou jste upravili, by měla obsahovat následující řádky:

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

Řádek chroot je důležitý, protože omezuje přístup procesu HAProxy pouze na soubory v adresáři /var/lib/haproxy. Řádek log /dev/log local0 vytvoří uvnitř tohoto adresáře soubor, který bude systém Rsyslog používat ke shromažďování záznamů protokolu.

Jakmile dokončíte úpravy řádků log v /etc/haproxy/haproxy.cfg, uložte a zavřete soubor stisknutím ESC, zadáním :wq a stisknutím ENTER.

Posledním krokem, který musíte v této části dokončit, je vytvoření adresáře /var/lib/haproxy/dev, protože ve výchozím nastavení neexistuje.

Vytvořte adresář pomocí příkazu mkdir a poté restartujte HAProxy:

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

Nyní jste nakonfigurovali HAProxy tak, aby odesílal své protokoly do socketu unixové domény, který se nachází v /var/lib/haproxy/dev/log. V dalším kroku nakonfigurujete službu Rsyslog tak, aby vytvořila soket a měla k němu přístup.

Krok 3 – Konfigurace služby Rsyslog pro sběr protokolů serveru HAProxy

Ve výchozí konfiguraci systému CentOS 8 služba Rsyslog nezpracovává protokoly serveru HAProxy. Chcete-li shromažďovat protokoly ze služby HAProxy, otevřete nový soubor /etc/rsyslog.d/99-haproxy.conf pomocí vi nebo preferovaného editoru:

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

Stisknutím i přepněte do režimu INSERT a poté do souboru vložte následující řádky:

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

Direktivou $AddUnixListenSocket říkáte serveru Rsyslog, aby vytvořil zásuvku unixové domény v zadaném umístění, v tomto případě /var/lib/haproxy/dev/log. Sekce :programname, startswith, "haproxy" určuje soubor, do kterého bude Rsyslog zapisovat záznamy protokolu, které shromažďuje ze zásuvky.

Jakmile dokončíte úpravy /etc/rsyslog.d/99-haproxy.conf, uložte a zavřete soubor stisknutím ESC, zadáním :wq a stisknutím ENTER.

Nyní jste nakonfigurovali Rsyslog tak, aby četl záznamy protokolu ze zásuvky domény Unix v /var/lib/haproxy/dev/log a zapisoval je do souboru protokolu v /var/log/haproxy.log.

Před opětovným spuštěním Rsyslogu však budete muset zjistit, zda systém SELinux vynucuje kontrolu přístupu v systému CentOS 8.

Pro kontrolu aktuální politiky SELinuxu spusťte následující příkaz:

  • getenforce

Obdržíte jeden z následujících výstupů:

  • Enforcing – V tomto režimu SELinux vynucuje kontrolu přístupu v systému. Budete muset vyplnit následující volitelnou část Krok 4 – Konfigurace SELinuxu:
  • Permissive – V tomto případě SELinux zaznamenává všechny pokusy o přístup do svého souboru protokolu, ale nevynucuje ve vašem systému řízení přístupu.
  • Disabled – Pokud je SELinux zakázán, pak nezaznamenává ani nevynucuje ve vašem systému žádné zásady řízení přístupu.

Pokud příkaz getenforce vrátil Permissive nebo Disabled, pak můžete Rsyslog restartovat následujícím příkazem:

  • sudo systemctl restart rsyslog

Po restartování Rsyslogu budete moci zobrazit protokoly v souboru /var/log/haproxy.log, který jste nakonfigurovali v /etc/rsyslog.d/99-haproxy.conf. Přejděte ke kroku 5 – Testování protokolů HAProxy, abyste se ujistili, že vše funguje podle očekávání.

Pokud váš systém používá SELinux v režimu Enforcing, pak další část tohoto návodu vysvětluje, jak přidat modul, který umožní, aby spolu Rsyslog a HAProxy komunikovaly přes sdílený soket unixové domény.

Krok 4 – (volitelný) Konfigurace systému SELinux

Jestliže je váš systém CentOS 8 nakonfigurován se systémem SELinux v režimu Enforcing, pak budete muset povolit serveru Rsyslog přístup do adresáře chroot serveru HAProxy. Povolení tohoto přístupu umožní serveru Rsyslog vytvořit soket unixové domény, do kterého bude server HAproxy odesílat své protokoly.

Pokud nejste obeznámeni se systémem SELinux, tento seriál výukových kurzů Úvod do systému SELinux v systému CentOS 7 vám pomůže naučit se spravovat systém SELinux a pracovat s ním. Přestože je napsán pro systém CentOS 7, principy a příkazy v tomto seriálu jsou stejně použitelné i pro systém CentOS 8.

Chcete-li povolit přístup Rsyslogu a HAProxy k jejich sdílenému soketu, je prvním úkolem vytvořit soubor zásad vynucení typu. Otevřete nový soubor s názvem rsyslog-haproxy.te v vi nebo preferovaném editoru:

  • vi rsyslog-haproxy.te

Stisknutím i přepněte do režimu INSERT a poté do souboru vložte následující řádky:

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

První řádek definuje název a verzi modulu. Část require informuje modulový zavaděč SELinuxu o typech a třídách, které jsou vyžadovány, aby se zásada načetla jako modul. Poslední dva řádky jsou pravidla, která povolují přístup Rsyslogu k souboru HAProxy chroot, resp. socketu.

Po dokončení úprav soubor uložte a zavřete stisknutím ESC, zadáním :wq a stisknutím ENTER.

Následujícím příkazem nainstalujte balíček checkpolicy, který obsahuje nástroj checkmodule, který použijete k přeměně souboru Type Enforcement na modul SELinuxu.

  • sudo dnf install checkpolicy

Teď, když máte nainstalovaný nástroj checkmodule, je dalším krokem kompilace modulu a jeho následné nahrání do systému SELinux. Spusťte následující příkaz pro kompilaci souboru Type Enforcement do modulu SELinux:

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

Dále spusťte semodule_package pro vygenerování kompletního balíčku zásad, který může SELinux načíst do jádra Linuxu:

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

Posledním krokem je načtení vygenerovaného balíčku do jádra Linuxu pomocí příkazu semodule:

  • sudo semodule -i rsyslog-haproxy.pp

Přidání modulu může trvat několik sekund. Po dokončení příkazu můžete potvrdit, že je modul načten do jádra, spuštěním příkazu semodule:

  • sudo semodule -l |grep rsyslog-haproxy

Měli byste obdržet následující výstup:

Output
rsyslog-haproxy

Po načtení modulu můžete restartovat Rsyslog následujícím příkazem:

  • sudo systemctl restart rsyslog

Nyní jste definovali, zkompilovali a načetli politiku SELinux, která umožní HAProxy a Rsyslog komunikovat přes jejich sdílený soket.

V dalším kroku otestujete, zda vše funguje, a to tak, že zadáte požadavek HTTP serveru HAProxy a prozkoumáte jeho nový soubor protokolu.

Krok 5 – Testování protokolování HAProxy

Teď, když jste nakonfigurovali HAProxy, Rsyslog a volitelně SELinux, můžete otestovat, zda funguje protokolování na /var/log/haproxy.log.

Ve výchozím nastavení je balíček haproxy dodáván s konfiguračním souborem, který vytvoří zásuvku HTTP listener na portu 5000. Konfigurace ukazuje na neexistující backendový server, takže jakýkoli požadavek na tento port bude mít za následek chybu HTTP 503.

Chcete-li zkontrolovat chybu 503 v souboru /var/log/haproxy.log, nejprve vygenerujte požadavek HTTP pomocí příkazu curl takto:

  • curl -si http://127.0.0.1:5000

Měli byste obdržet následující výstup:

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>

Nyní prozkoumejte /var/log/haproxy.log na případné odpovědi HTTP 503 pomocí příkazu grep:

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

Poznámka: Část příkazu NOSRV.+503 je regulární výraz. Tento návod Použití regulárních výrazů Grep & k vyhledávání textových vzorů v systému Linux
se podrobněji zabývá použitím příkazu grep a regulárních výrazů.

Měli byste obdržet následující řádek (nebo více řádků):

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"

Tento řádek odpovídá požadavku curl, který jste zadali, což znamená, že Rsyslog a HAProxy jsou nakonfigurovány tak, aby správně používaly svůj sdílený soket.

Závěr

V tomto rychlém návodu jste nakonfigurovali HAProxy pro přihlašování do soketu domény Unix. Rovněž jste nastavili Rsyslog tak, aby vytvářel a četl z tohoto socketu, takže oba programy spolu mohou komunikovat, aniž by se v systému otevíraly porty TCP/IP. Nakonec jste volitelně zkompilovali, zkompilovali a načetli politiku SELinux, abyste umožnili Rsyslogu a HAProxy sdílený přístup k jejich soketu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.