Wprowadzenie
HAProxy, co jest skrótem od High Availability Proxy, jest szeroko stosowanym serwerem proxy opartym na TCP i HTTP, który działa w systemach Linux, Solaris i FreeBSD. Jest on używany do równoważenia obciążenia aplikacji poprzez dystrybucję żądań między wieloma serwerami oraz do zapewnienia, że aplikacje są wysoce dostępne dla użytkowników.
Domyślnie w wielu instalacjach CentOS 8, HAProxy nie jest skonfigurowany do zapisywania logów do pliku. Ten samouczek wyjaśni, jak skonfigurować logowanie HAProxy za pomocą Rsyslog przy użyciu gniazda domeny Unix dla niezawodności, szybkości i bezpieczeństwa.
Wymagania wstępne
Aby ukończyć ten samouczek, będziesz potrzebował serwera z systemem CentOS 8. Serwer ten powinien mieć użytkownika nie będącego rootem z uprawnieniami administracyjnymi. Aby go skonfigurować, postępuj zgodnie z przewodnikiem Initial Server Setup guide for CentOS 8 tutorial.
Krok 1 – Instalowanie i włączanie HAProxy
Aby zainstalować HAProxy, uruchom następujące polecenie dnf
:
- sudo dnf install haproxy
Gdy pojawi się monit Is this ok :
wpisz y
i naciśnij RETURN
, aby zainstalować pakiet.
Po zainstalowaniu pakietu HAProxy włącz go i uruchom za pomocą polecenia systemctl
:
- sudo systemctl enable haproxy.service
Powinieneś otrzymać następujące dane wyjściowe:
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
Z włączoną teraz usługą HAProxy możesz ją uruchomić, aby upewnić się, że działa w domyślnej konfiguracji na Twoim serwerze:
- sudo systemctl start haproxy.service
Następnie zbadaj status HAProxy, aby upewnić się, że jest uruchomiona:
- sudo systemctl status haproxy.service
Powinieneś otrzymać dane wyjściowe jak poniżej. Zwróć uwagę na podświetloną część wyjścia active (running)
. Jeśli twój serwer pokazuje tę samą podświetloną sekcję, to HAProxy działa poprawnie na twoim serwerze i możesz kontynuować konfigurowanie logowania.
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. . .
Jeśli twoje dane wyjściowe są inne, lub status pokazuje coś w stylu Active: failed
, to wykonaj kroki rozwiązywania problemów w samouczku How to Troubleshoot Common HAProxy Errors (Jak rozwiązywać typowe błędy HAProxy), aby określić, co uniemożliwia HAProxy prawidłowe uruchomienie.
Po potwierdzeniu, że HAProxy jest włączone i działa, możesz kontynuować do następnego kroku, którym jest konfiguracja dyrektyw logowania HAProxy.
Krok 2 – Konfiguracja dyrektyw logowania HAProxy
Aby skonfigurować dyrektywy logowania HAProxy, otwórz /etc/haproxy/haproxy.cfg
w vi
lub preferowanym edytorze:
- sudo vi /etc/haproxy/haproxy.cfg
Naciśnij i
, aby przełączyć się do trybu INSERT
, a następnie znajdź linię log 127.0.0.1 local2
i wykomentuj ją, dodając znak #
na początku linii, jak zaznaczono w poniższym przykładzie:
. . .# 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. . .
Następnie dodaj linię bezpośrednio po skomentowanej linii o następującej treści:
log /dev/log local0
Cała sekcja /etc/haproxy/haproxy.cfg
, którą edytowałeś, powinna zawierać następujące linie:
. . .# local2.* /var/log/haproxy.log# #log 127.0.0.1 local2 log /dev/log local0 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid. . .
Linia chroot
jest ważna, ponieważ ogranicza proces HAProxy do dostępu tylko do plików w katalogu /var/lib/haproxy
. Wiersz log /dev/log local0
utworzy plik wewnątrz tego katalogu, którego Rsyslog będzie używać do zbierania wpisów dziennika.
Po zakończeniu edycji log
wierszy w /etc/haproxy/haproxy.cfg
zapisz i zamknij plik, naciskając ESC
, wpisując :wq
i naciskając ENTER
.
Ostatnim krokiem, który musisz wykonać w tej sekcji, jest utworzenie katalogu /var/lib/haproxy/dev
, ponieważ domyślnie on nie istnieje.
Utwórz katalog za pomocą polecenia mkdir
, a następnie ponownie uruchom HAProxy:
- sudo mkdir /var/lib/haproxy/dev
- sudo systemctl restart haproxy.service
Teraz skonfigurowałeś HAProxy do wysyłania swoich logów do gniazda domeny uniksowej, które rezyduje w /var/lib/haproxy/dev/log
. W następnym kroku skonfigurujesz Rsyslog do tworzenia i dostępu do gniazda.
Krok 3 – Konfigurowanie Rsyslog do zbierania logów HAProxy
Domyślna konfiguracja Rsyslog w CentOS 8 nie obsługuje logów HAProxy. Aby zbierać logi z usługi HAProxy, otwórz nowy plik /etc/rsyslog.d/99-haproxy.conf
za pomocą vi
lub preferowanego edytora:
- sudo vi /etc/rsyslog.d/99-haproxy.conf
Naciśnij i
, aby przełączyć się do trybu INSERT
, a następnie wklej następujące wiersze do pliku:
$AddUnixListenSocket /var/lib/haproxy/dev/log# Send HAProxy messages to a dedicated logfile:programname, startswith, "haproxy" { /var/log/haproxy.log stop}
Dyrektywa $AddUnixListenSocket
mówi Rsyslogowi, aby utworzył gniazdo domeny uniksowej w określonej lokalizacji, w tym przypadku /var/lib/haproxy/dev/log
. Sekcja :programname, startswith, "haproxy"
określa plik, do którego Rsyslog będzie zapisywać wpisy dziennika pobierane z gniazda.
Po zakończeniu edycji /etc/rsyslog.d/99-haproxy.conf
zapisz i zamknij plik, naciskając ESC
, wpisując :wq
i naciskając ENTER
.
Teraz skonfigurowałeś Rsyslog do odczytywania wpisów dziennika z gniazda domeny Unix w /var/lib/haproxy/dev/log
i zapisywania ich do pliku dziennika w /var/log/haproxy.log
.
Jednakże przed ponownym uruchomieniem Rsyslog musisz ustalić, czy SELinux wymusza kontrolę dostępu w systemie CentOS 8.
Aby sprawdzić aktualną politykę SELinux, wykonaj następujące polecenie:
- getenforce
Otrzymasz jedno z następujących wyjść:
-
Enforcing
– W tym trybie SELinux wymusza kontrolę dostępu w systemie. Będziesz musiał wykonać następujący opcjonalny Krok 4 – Konfigurowanie sekcji SELinux. -
Permissive
– W tym przypadku SELinux rejestruje wszystkie próby dostępu do swojego pliku dziennika, ale nie wymusza kontroli dostępu w systemie. -
Disabled
– Jeśli SELinux jest wyłączony, to nie rejestruje ani nie wymusza żadnych zasad kontroli dostępu w systemie.
Jeśli polecenie getenforce
zwróciło wartość Permissive
lub Disabled
, można ponownie uruchomić program Rsyslog za pomocą następującego polecenia:
- sudo systemctl restart rsyslog
Po ponownym uruchomieniu programu Rsyslog będzie można wyświetlić dzienniki w pliku /var/log/haproxy.log
, który został skonfigurowany w /etc/rsyslog.d/99-haproxy.conf
. Przejdź do Kroku 5 – Testowanie logowania HAProxy, aby upewnić się, że wszystko działa zgodnie z oczekiwaniami.
W przeciwnym razie, jeśli twój system działa z SELinux w trybie Enforcing
, to następna sekcja tego samouczka wyjaśnia, jak dodać moduł, aby pozwolić Rsyslog i HAProxy komunikować się ze sobą przez ich wspólne gniazdo domeny Unix.
Krok 4 – (Opcjonalnie) Konfiguracja SELinux
Jeśli twój system CentOS 8 jest skonfigurowany z SELinux w trybie Enforcing
, wtedy będziesz musiał pozwolić Rsyslogowi na dostęp do katalogu chroot
HAProxy. Zezwolenie na ten dostęp pozwoli Rsyslogowi utworzyć gniazdo domeny uniksowej, do którego HAproxy będzie wysyłać swoje logi.
Jeśli nie jesteś zaznajomiony z SELinuksem, ten samouczek Wprowadzenie do SELinuksa w CentOS 7 pomoże Ci dowiedzieć się, jak zarządzać i współdziałać z SELinuksem. Chociaż jest ona napisana dla systemu CentOS 7, zasady i polecenia zawarte w tej serii mają takie samo zastosowanie w systemie CentOS 8.
Aby umożliwić dostęp Rsyslog i HAProxy do ich współdzielonego gniazda, pierwszym zadaniem jest utworzenie pliku polityki Type Enforcement. Otwórz nowy plik o nazwie rsyslog-haproxy.te
w vi
lub preferowanym edytorze:
- vi rsyslog-haproxy.te
Naciśnij klawisz i
, aby przełączyć się do trybu INSERT
, a następnie wklej do pliku następujące wiersze:
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 };
Pierwszy wiersz określa nazwę i wersję modułu. Część require
mówi modułowi ładującemu SELinux o typach i klasach, które są wymagane, aby polityka została załadowana jako moduł. Dwie ostatnie linie to reguły, które pozwalają na dostęp Rsysloga do pliku chroot
i gniazda HAProxy.
Po zakończeniu edycji pliku zapisz go i zamknij, naciskając ESC
, wpisując :wq
i naciskając ENTER
.
Następnie wykonaj następujące polecenie, aby zainstalować pakiet checkpolicy
, który zawiera narzędzie checkmodule
, którego użyjesz do przekształcenia pliku Wymuszenie typu w moduł SELinux.
- sudo dnf install checkpolicy
Teraz, gdy masz już zainstalowane narzędzie checkmodule
, następnym krokiem jest skompilowanie modułu, a następnie załadowanie go do SELinux. Wykonaj następujące czynności, aby skompilować plik Wymuszenie typu do modułu SELinux:
- checkmodule -M -m rsyslog-haproxy.te -o rsyslog-haproxy.mod
Następnie wykonaj polecenie semodule_package
, aby wygenerować kompletny pakiet zasad, który SELinux może załadować do jądra systemu Linux:
- semodule_package -o rsyslog-haproxy.pp -m rsyslog-haproxy.mod
Ostatnim krokiem jest załadowanie wygenerowanego pakietu do jądra systemu Linux za pomocą polecenia semodule
:
- sudo semodule -i rsyslog-haproxy.pp
Dodanie modułu może zająć kilka sekund. Po zakończeniu polecenia możesz potwierdzić, że moduł jest załadowany do jądra, uruchamiając polecenie semodule
:
- sudo semodule -l |grep rsyslog-haproxy
Powinieneś otrzymać dane wyjściowe jak poniżej:
Outputrsyslog-haproxy
Po załadowaniu modułu możesz zrestartować Rsysloga następującym poleceniem:
- sudo systemctl restart rsyslog
Zdefiniowałeś, skompilowałeś i załadowałeś politykę SELinux, która pozwoli HAProxy i Rsyslogowi komunikować się przez ich wspólne gniazdo.
W następnym kroku sprawdzisz, czy wszystko działa, wykonując żądanie HTTP do HAProxy i sprawdzając jego nowy plik dziennika.
Krok 5 – Testowanie logowania HAProxy
Teraz, gdy skonfigurowałeś HAProxy, Rsyslog i opcjonalnie SELinux, możesz przetestować, czy logowanie do /var/log/haproxy.log
działa.
Domyślnie pakiet haproxy
dostarcza plik konfiguracyjny, który tworzy gniazdo słuchacza HTTP na porcie 5000. Konfiguracja wskazuje na nieistniejący serwer backendowy, więc każde żądanie na ten port spowoduje błąd HTTP 503.
Aby sprawdzić, czy w pliku /var/log/haproxy.log
nie występuje błąd 503, najpierw wygeneruj żądanie HTTP za pomocą polecenia curl
w następujący sposób:
- curl -si http://127.0.0.1:5000
Powinieneś otrzymać dane wyjściowe podobne do poniższych:
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>
Następnie sprawdź /var/log/haproxy.log
pod kątem odpowiedzi HTTP 503 za pomocą polecenia grep
:
- sudo grep -E 'NOSRV.+503' /var/log/haproxy.log
Uwaga: Część NOSRV.+503
tego polecenia jest wyrażeniem regularnym. Ten samouczek na temat używania polecenia Grep &wyrażenia regularne do wyszukiwania wzorców tekstowych w Linuksie
dokładniej omawia użycie polecenia grep
i wyrażeń regularnych.
Powinieneś otrzymać wiersz (lub wiele wierszy) jak poniżej:
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"
Ten wiersz odpowiada żądaniu curl
, które wykonałeś, co oznacza, że Rsyslog i HAProxy są skonfigurowane do poprawnego używania współdzielonego gniazda.
Wniosek
W tym samouczku szybkiego startu skonfigurowałeś HAProxy do logowania do gniazda domeny Uniksa. Skonfigurowałeś także Rsyslog do tworzenia i odczytu z gniazda, tak aby te dwa programy mogły komunikować się ze sobą bez otwierania jakichkolwiek portów TCP/IP w systemie. Wreszcie, opcjonalnie skompilowałeś, spakowałeś i załadowałeś zasady SELinux, aby umożliwić Rsyslog i HAProxy wspólny dostęp do ich gniazda.