Introducere
HAProxy, care înseamnă High Availability Proxy, este un server proxy bazat pe TCP și HTTP, utilizat pe scară largă, care rulează pe Linux, Solaris și FreeBSD. Este utilizat pentru a echilibra încărcarea aplicațiilor prin distribuirea solicitărilor între mai multe servere și pentru a se asigura că aplicațiile sunt foarte disponibile pentru utilizatori.
În mod implicit, pe multe instalații CentOS 8, HAProxy nu este configurat să scrie ieșirea jurnalului său într-un fișier. Acest tutorial de inițiere rapidă va explica cum să configurați jurnalizarea HAProxy cu Rsyslog utilizând un socket de domeniu Unix pentru fiabilitate, viteză și securitate.
Precondiții
Pentru a finaliza acest tutorial, veți avea nevoie de un server care rulează CentOS 8. Acest server trebuie să aibă un utilizator non-root cu privilegii administrative. Pentru a-l configura, urmați ghidul de configurare inițială a serverului pentru tutorialul CentOS 8.
Pasul 1 – Instalarea și activarea HAProxy
Pentru a instala HAProxy, rulați următoarea comandă dnf
:
- sudo dnf install haproxy
Când vi se solicită Is this ok :
introduceți y
și apăsați RETURN
pentru a instala pachetul.
După ce ați instalat HAProxy, activați-l și porniți-l folosind comanda systemctl
:
- sudo systemctl enable haproxy.service
Ar trebui să primiți următoarea ieșire:
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
Cu serviciul HAProxy activat acum, îl puteți porni pentru a vă asigura că rulează cu o configurație implicită pe serverul dumneavoastră:
- sudo systemctl start haproxy.service
În continuare, examinați starea lui HAProxy pentru a vă asigura că rulează:
- sudo systemctl status haproxy.service
Ar trebui să primiți o ieșire ca cea de mai jos. Observați porțiunea evidențiată active (running)
din ieșire. Dacă serverul dvs. afișează aceeași secțiune evidențiată, atunci HAProxy rulează corect pe serverul dvs. și puteți continua cu configurarea jurnalizării.
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. . .
Dacă ieșirea dvs. este diferită sau starea afișează ceva de genul Active: failed
, urmați pașii de depanare din tutorialul How to Troubleshoot Common HAProxy Errors (Cum să depanați erorile comune HAProxy) pentru a determina ce împiedică HAProxy să pornească corect.
După ce ați confirmat că HAProxy este activat și funcționează, puteți trece la pasul următor, care constă în configurarea directivelor de logare ale lui HAProxy.
Pasul 2 – Configurarea directivelor de logare ale HAProxy
Pentru a configura directivele de logare ale HAProxy, deschideți /etc/haproxy/haproxy.cfg
în vi
sau în editorul dumneavoastră preferat:
- sudo vi /etc/haproxy/haproxy.cfg
Presați i
pentru a trece în modul INSERT
, apoi găsiți linia log 127.0.0.1 local2
și comentați-o adăugând un caracter #
la începutul liniei, așa cum este evidențiat în următorul exemplu:
. . .# 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. . .
Acum adăugați o linie direct după linia comentată cu următorul conținut:
log /dev/log local0
Întreaga secțiune din /etc/haproxy/haproxy.cfg
pe care ați editat-o ar trebui să conțină următoarele linii:
. . .# 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
este importantă, deoarece restricționează procesul HAProxy să acceseze doar fișierele din directorul /var/lib/haproxy
. Linia log /dev/log local0
va crea un fișier în interiorul acelui director pe care Rsyslog îl va folosi pentru a colecta intrările de jurnal.
După ce ați terminat de editat liniile log
din /etc/haproxy/haproxy.cfg
, salvați și închideți fișierul apăsând ESC
, tastând :wq
și apăsând ENTER
.
Ultimul pas pe care trebuie să-l finalizați în această secțiune este crearea directorului /var/lib/haproxy/dev
, deoarece acesta nu există în mod implicit.
Crearea directorului folosind comanda mkdir
și apoi reporniți HAProxy:
- sudo mkdir /var/lib/haproxy/dev
- sudo systemctl restart haproxy.service
Acum ați configurat HAProxy pentru a trimite jurnalele sale către un socket de domeniu Unix care rezidă în /var/lib/haproxy/dev/log
. În pasul următor, veți configura Rsyslog pentru a crea și accesa socket-ul.
Pasul 3 – Configurarea Rsyslog pentru a colecta jurnalele HAProxy
Configurarea implicită a lui Rsyslog pe CentOS 8 nu gestionează jurnalele HAProxy. Pentru a colecta jurnalele de la serviciul HAProxy, deschideți un nou fișier /etc/rsyslog.d/99-haproxy.conf
folosind vi
sau editorul preferat:
- sudo vi /etc/rsyslog.d/99-haproxy.conf
Presați i
pentru a trece în modul INSERT
, apoi lipiți următoarele linii în fișier:
$AddUnixListenSocket /var/lib/haproxy/dev/log# Send HAProxy messages to a dedicated logfile:programname, startswith, "haproxy" { /var/log/haproxy.log stop}
Directiva $AddUnixListenSocket
îi spune lui Rsyslog să creeze un socket de domeniu Unix în locația specificată, în acest caz /var/lib/haproxy/dev/log
. Secțiunea :programname, startswith, "haproxy"
specifică fișierul în care Rsyslog va scrie intrările de jurnal pe care le colectează de la socket.
După ce ați terminat de editat /etc/rsyslog.d/99-haproxy.conf
, salvați și închideți fișierul apăsând ESC
, tastând :wq
și apăsând ENTER
.
Acum ați configurat Rsyslog să citească intrările de jurnal de la socket-ul de domeniu Unix din /var/lib/haproxy/dev/log
și să le scrie într-un fișier de jurnal în /var/log/haproxy.log
.
Cu toate acestea, înainte de a reporni Rsyslog, va trebui să determinați dacă SELinux aplică controlul accesului pe sistemul dumneavoastră CentOS 8.
Pentru a verifica politica actuală a SELinux, rulați următoarele:
- getenforce
Voi primi una dintre următoarele ieșiri:
-
Enforcing
– În acest mod, SELinux aplică controlul accesului pe sistemul dumneavoastră. Va trebui să completați următoarea secțiune opțională Pasul 4 – Configurarea SELinux. -
Permissive
– În acest caz, SELinux înregistrează toate încercările de acces în fișierul său jurnal, dar nu impune controale de acces pe sistemul dumneavoastră. -
Disabled
– Dacă SELinux este dezactivat, atunci nu înregistrează și nu impune nicio politică de control al accesului pe sistemul dumneavoastră.
Dacă comanda getenforce
a returnat fie Permissive
, fie Disabled
, atunci puteți reporni Rsyslog cu următoarea comandă:
- sudo systemctl restart rsyslog
După ce ați repornit Rsyslog, veți putea vizualiza jurnalele din fișierul /var/log/haproxy.log
pe care l-ați configurat în /etc/rsyslog.d/99-haproxy.conf
. Treceți la Pasul 5 – Testarea jurnalizării HAProxy pentru a vă asigura că totul funcționează conform așteptărilor.
În caz contrar, dacă sistemul dvs. rulează SELinux în modul Enforcing
, atunci următoarea secțiune a acestui tutorial explică modul de adăugare a unui modul care să permită Rsyslog și HAProxy să comunice între ele prin intermediul socket-ului lor comun de domeniu Unix.
Pasul 4 – (Opțional) Configurarea SELinux
Dacă sistemul dumneavoastră CentOS 8 este configurat cu SELinux în modul Enforcing
, atunci va trebui să permiteți accesul Rsyslog la directorul chroot
al HAProxy. Permițând acest acces, Rsyslog va permite Rsyslog să creeze socket-ul de domeniu Unix la care HAproxy va trimite jurnalele sale.
Dacă nu sunteți familiarizat cu SELinux, această serie de tutoriale An Introduction to SELinux on CentOS 7 vă va ajuta să învățați cum să gestionați și să interacționați cu SELinux. Deși este scris pentru CentOS 7, principiile și comenzile din această serie sunt la fel de aplicabile și la CentOS 8.
Pentru a permite accesul Rsyslog și HAProxy la socket-ul lor partajat, prima sarcină este de a crea un fișier de politică Type Enforcement. Deschideți un nou fișier numit rsyslog-haproxy.te
în vi
sau în editorul preferat:
- vi rsyslog-haproxy.te
Presați i
pentru a trece în modul INSERT
, apoi lipiți următoarele linii în fișier:
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 };
Prima linie definește numele și versiunea modulului. Porțiunea require
îi spune încărcătorului de module SELinux despre tipurile și clasele care sunt necesare pentru ca politica să fie încărcată ca modul. Ultimele două linii sunt regulile care permit accesul Rsyslog la fișierul chroot
și, respectiv, la fișierul socket al HAProxy.
Când ați terminat de editat fișierul, salvați-l și închideți-l apăsând ESC
, tastând :wq
și apăsând ENTER
.
În continuare, rulați următoarea comandă pentru a instala pachetul checkpolicy
, care conține utilitarul checkmodule
pe care îl veți folosi pentru a transforma fișierul Type Enforcement într-un modul SELinux.
- sudo dnf install checkpolicy
Acum că aveți instalat utilitarul checkmodule
, următorul pas este să compilați modulul și apoi să îl încărcați în SELinux. Rulați următoarele pentru a compila fișierul Type Enforcement într-un modul SELinux:
- checkmodule -M -m rsyslog-haproxy.te -o rsyslog-haproxy.mod
În continuare, rulați semodule_package
pentru a genera un pachet complet de politici pe care SELinux îl poate încărca în nucleul Linux:
- semodule_package -o rsyslog-haproxy.pp -m rsyslog-haproxy.mod
Pasul final este de a încărca pachetul pe care l-ați generat în nucleul Linux folosind comanda semodule
:
- sudo semodule -i rsyslog-haproxy.pp
Aducerea modulului poate dura câteva secunde. După finalizarea comenzii, puteți confirma că modulul este încărcat în kernel prin rularea comenzii semodule
:
- sudo semodule -l |grep rsyslog-haproxy
Ar trebui să primiți o ieșire ca următoarea:
Outputrsyslog-haproxy
După ce modulul este încărcat, puteți reporni Rsyslog cu următoarea comandă:
- sudo systemctl restart rsyslog
Acum ați definit, compilat și încărcat o politică SELinux care va permite HAProxy și Rsyslog să comunice prin intermediul socket-ului lor partajat.
În pasul următor veți testa dacă totul funcționează făcând o cerere HTTP către HAProxy și examinând noul său fișier jurnal.
Pasul 5 – Testarea jurnalizării HAProxy
Acum că ați configurat HAProxy, Rsyslog și, opțional, SELinux, puteți testa dacă jurnalizarea către /var/log/haproxy.log
funcționează.
În mod implicit, pachetul haproxy
este livrat cu un fișier de configurare care creează un socket de ascultare HTTP pe portul 5000. Configurația indică un server backend inexistent, astfel încât orice solicitare către acest port va avea ca rezultat o eroare HTTP 503.
Pentru a verifica dacă există o eroare 503 în fișierul dvs. /var/log/haproxy.log
, generați mai întâi o cerere HTTP folosind curl
astfel:
- curl -si http://127.0.0.1:5000
Ar trebui să primiți o ieșire ca următoarea:
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>
Acum examinați /var/log/haproxy.log
pentru orice răspuns HTTP 503 folosind comanda grep
:
- sudo grep -E 'NOSRV.+503' /var/log/haproxy.log
Nota: Porțiunea NOSRV.+503
a comenzii este o expresie regulată. Acest tutorial privind utilizarea expresiilor regulate Grep & pentru a căuta tipare de text în Linux
explică mai în profunzime utilizarea grep
și a expresiilor regulate.
Ar trebui să primiți o linie (sau mai multe linii) ca următoarea:
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"
Această linie corespunde cererii curl
pe care ați făcut-o, ceea ce înseamnă că Rsyslog și HAProxy sunt configurate pentru a utiliza corect socket-ul lor partajat.
Concluzie
În acest tutorial de inițiere rapidă, ați configurat HAProxy pentru a se conecta la un socket de domeniu Unix. De asemenea, ați configurat Rsyslog pentru a crea și citi de pe socket, astfel încât cele două programe să poată comunica între ele fără a deschide porturi TCP/IP pe sistemul dumneavoastră. În cele din urmă, ați compilat, împachetat și încărcat opțional o politică SELinux pentru a permite accesul comun al Rsyslog și HAProxy la socket-ul lor.