Introduction
HAProxy, joka on lyhenne sanoista High Availability Proxy, on laajalti käytetty TCP- ja HTTP-pohjainen välityspalvelin, joka toimii Linuxissa, Solariksessa ja FreeBSD:ssä. Sitä käytetään sovellusten kuorman tasapainottamiseen jakamalla pyyntöjä useiden palvelimien välillä ja varmistamaan, että sovellukset ovat erittäin hyvin käyttäjien käytettävissä.
HAProxy ei ole oletusarvoisesti monissa CentOS 8 -asennuksissa määritetty kirjoittamaan lokitulostettaan tiedostoon. Tässä pikaoppaassa kerrotaan, miten HAProxyn lokitiedostojen tallennus määritetään Rsyslogin avulla käyttämällä Unix-verkkotunnussokkelia luotettavuuden, nopeuden ja turvallisuuden takaamiseksi.
Edellytykset
Tämän ohjeen suorittamiseksi tarvitset palvelimen, jossa on CentOS 8. Tällä palvelimella tulee olla ei-root-käyttäjä, jolla on järjestelmänvalvojan oikeudet. Voit asentaa sen noudattamalla CentOS 8:n palvelimen alkuasennusopasta.
Vaihe 1 – HAProxyn asentaminen ja käyttöönotto
Asenna HAProxy suorittamalla seuraava dnf
-komento:
- sudo dnf install haproxy
Kun saat kehotuksen Is this ok :
, kirjoita y
ja paina RETURN
asentaaksesi paketin.
Kun olet asentanut HAProxyn, ota se käyttöön ja käynnistä se komennolla systemctl
:
- sudo systemctl enable haproxy.service
Sinulle pitäisi tulla seuraava tuloste:
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
Kun HAProxy-palvelu on nyt otettu käyttöön, voit käynnistää sen varmistaaksesi, että se toimii palvelimesi oletuskonfiguraatiolla:
- sudo systemctl start haproxy.service
Tarkista seuraavaksi HAProxy-palvelun tila varmistaaksesi, että se on käynnissä:
- sudo systemctl status haproxy.service
Pitäisi saada seuraavan kaltainen tuloste. Huomaa tuotoksen korostettu active (running)
-osa. Jos palvelimellasi näkyy sama korostettu osa, HAProxy toimii oikein palvelimellasi ja voit jatkaa kirjauksen määrittämistä.
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. . .
Jos tulosteesi on erilainen tai tilassa näkyy jotakin Active: failed
kaltaista, noudata vianmääritysvaiheita, jotka on esitetty oppaassa Yleisten HAProxy-virheiden vianmääritys selvittääksesi, mikä estää HAProxya käynnistymästä oikein.
Kun olet varmistanut, että HAProxy on käytössä ja käynnissä, voit jatkaa seuraavaan vaiheeseen, joka on HAProxyn lokitusdirektiivien määrittäminen.
Vaihe 2 – HAProxyn lokidirektiivien konfigurointi
Avataksesi HAProxyn lokidirektiivien konfiguroinnin avaa /etc/haproxy/haproxy.cfg
vi
– tai haluamallasi editorilla:
- sudo vi /etc/haproxy/haproxy.cfg
Paina i
siirtyäksesi INSERT
-tilaan, etsi sitten rivi log 127.0.0.1 local2
ja kommentoi se pois lisäämällä #
-merkki rivin alkuun, kuten seuraavassa esimerkissä korostetaan:
. . .# 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. . .
Lisää nyt suoraan kommentoidun rivin jälkeen rivi, jonka sisältö on seuraava:
log /dev/log local0
Koko muokkaamasi /etc/haproxy/haproxy.cfg
-kohdan tulisi sisältää seuraavat rivit:
. . .# local2.* /var/log/haproxy.log# #log 127.0.0.1 local2 log /dev/log local0 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid. . .
Rivi chroot
on tärkeä, koska se rajoittaa HAProxy-prosessin käyttämään vain hakemistossa /var/lib/haproxy
olevia tiedostoja. Rivillä log /dev/log local0
luodaan kyseisen hakemiston sisälle tiedosto, josta Rsyslog kerää lokimerkintöjä.
Kun olet muokannut /etc/haproxy/haproxy.cfg
:n log
riviä, tallenna ja sulje tiedosto painamalla ESC
, kirjoittamalla :wq
ja painamalla ENTER
.
Viimeinen vaihe, joka sinun täytyy suorittaa tässä osiossa, on luoda hakemisto /var/lib/haproxy/dev
, koska sitä ei ole oletusarvoisesti olemassa.
Luo hakemisto komennolla mkdir
ja käynnistä sitten HAProxy uudelleen:
- sudo mkdir /var/lib/haproxy/dev
- sudo systemctl restart haproxy.service
Olet nyt konfiguroinut HAProxyn lähettämään lokinsa Unix-toimialueen pistorasiaan, joka sijaitsee osoitteessa /var/lib/haproxy/dev/log
. Seuraavassa vaiheessa konfiguroit Rsyslogin luomaan socketin ja käyttämään sitä.
Vaihe 3 – Rsyslogin konfigurointi HAProxy-lokeja keräämään
Rsyslogin oletuskonfiguraatio CentOS 8:ssa ei käsittele HAProxy-lokeja. Jotta voit kerätä lokit HAProxy-palvelusta, avaa uusi tiedosto /etc/rsyslog.d/99-haproxy.conf
käyttäen vi
tai haluamaasi editoria:
- sudo vi /etc/rsyslog.d/99-haproxy.conf
Paina i
vaihtaaksesi INSERT
-tilaan ja liitä sitten seuraavat rivit tiedostoon:
$AddUnixListenSocket /var/lib/haproxy/dev/log# Send HAProxy messages to a dedicated logfile:programname, startswith, "haproxy" { /var/log/haproxy.log stop}
Direktiivi $AddUnixListenSocket
käskee Rsyslogia luomaan Unix-verkkotunnuksen socketin määritettyyn paikkaan, tässä tapauksessa /var/lib/haproxy/dev/log
. Kohdassa :programname, startswith, "haproxy"
määritetään tiedosto, johon Rsyslog kirjoittaa lokimerkinnät, jotka se kerää socketista.
Kun olet valmis muokkaamaan /etc/rsyslog.d/99-haproxy.conf
, tallenna ja sulje tiedosto painamalla ESC
, kirjoittamalla :wq
ja painamalla ENTER
.
Olet nyt määrittänyt Rsyslogin lukemaan lokimerkinnät Unix-toimialueen socketista osoitteessa /var/lib/haproxy/dev/log
ja kirjoittamaan ne lokitiedostoon osoitteessa /var/log/haproxy.log
.
Mutta ennen Rsyslogin uudelleenkäynnistämistä sinun on määritettävä, onko SELinux valvomassa pääsynvalvontaa CentOS 8 -järjestelmässäsi.
Voidaksesi tarkistaa SELinuxin tämänhetkisen politiikan, suorita seuraava:
- getenforce
Saat jonkin seuraavista tulosteista:
-
Enforcing
– Tässä tilassa SELinux valvoo pääsynvalvontaa järjestelmässäsi. Sinun on suoritettava seuraava valinnainen Vaihe 4 – SELinuxin määrittäminen -osio. -
Permissive
– Tässä tapauksessa SELinux kirjaa kaikki pääsyyritykset lokitiedostoonsa, mutta ei valvo pääsynvalvontaa järjestelmässäsi. -
Disabled
– Jos SELinux on kytketty pois käytöstä, se ei kirjaa eikä valvo pääsynvalvontakäytäntöjä järjestelmässäsi.
Jos getenforce
-komento antoi tulokseksi joko Permissive
tai Disabled
, voit käynnistää Rsyslogin uudelleen seuraavalla komennolla:
- sudo systemctl restart rsyslog
Kun olet käynnistänyt Rsyslogin uudelleen, voit tarkastella lokitiedostoja /var/log/haproxy.log
-tiedostossa, jonka määrittelit kohdassa /etc/rsyslog.d/99-haproxy.conf
. Siirry vaiheeseen 5 – HAProxy-loggauksen testaaminen varmistaaksesi, että kaikki toimii odotetulla tavalla.
Muussa tapauksessa, jos järjestelmässäsi on SELinux Enforcing
-tilassa, tämän ohjeen seuraavassa osassa kerrotaan, miten lisätään moduuli, jonka avulla Rsyslog ja HAProxy voivat kommunikoida toistensa kanssa jaetun Unix-toimialueen socketin kautta.
Vaihe 4 – (Valinnainen) SELinuxin konfigurointi
Jos CentOS 8 -järjestelmäsi on konfiguroitu SELinuxin kanssa Enforcing
-tilassa, sinun on sallittava Rsyslogin pääsy HAProxyn chroot
-hakemistoon. Tämän pääsyn salliminen antaa Rsyslogin luoda Unix-verkkotunnuksen socketin, johon HAproxy lähettää lokinsa.
Jos SELinux ei ole sinulle tuttu, tämä opetussarja Johdatus SELinuxiin CentOS 7:ssä auttaa sinua oppimaan SELinuxin hallintaa ja vuorovaikutusta. Vaikka se on kirjoitettu CentOS 7:lle, sarjan periaatteet ja komennot ovat yhtä lailla sovellettavissa CentOS 8:aan.
Voidaksesi sallia Rsyslogin ja HAProxyn pääsyn jaettuun socketiin, ensimmäinen tehtävä on luoda Type Enforcement -käytäntötiedosto. Avaa uusi tiedosto nimeltä rsyslog-haproxy.te
ohjelmassa vi
tai haluamassasi editorissa:
- vi rsyslog-haproxy.te
Vaihda INSERT
-tilaan painamalla i
ja liitä sitten seuraavat rivit tiedostoon:
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 };
Ensimmäisellä rivillä määritellään moduulin nimi ja versio. require
-osa kertoo SELinux-moduulinlataajalle tyypit ja luokat, joita tarvitaan, jotta käytäntö voidaan ladata moduulina. Kaksi viimeistä riviä ovat säännöt, jotka sallivat Rsyslogin pääsyn HAProxyn chroot
– ja socket-tiedostoon vastaavasti.
Kun olet valmis muokkaamaan tiedostoa, tallenna ja sulje se painamalla ESC
, kirjoittamalla :wq
ja painamalla ENTER
.
Seuraavaksi suorita seuraava komento asentaaksesi checkpolicy
-paketin, joka sisältää checkmodule
-apuohjelman, jota käytät muuttaaksesi Type Enforcement -tiedostosta SELinux-moduulin.
- sudo dnf install checkpolicy
Nyt kun olet asentanut checkmodule
-työkalun, seuraavana askeleena on moduulin kääntäminen ja sen jälkeen sen lataaminen SELinuxiin. Suorita seuraava komento kääntääksesi Type Enforcement-tiedoston SELinux-moduuliksi:
- checkmodule -M -m rsyslog-haproxy.te -o rsyslog-haproxy.mod
Seuraavaksi suorita komento semodule_package
luodaksesi täydellisen käytäntöpaketin, jonka SELinux voi ladata Linux-ytimeen:
- semodule_package -o rsyslog-haproxy.pp -m rsyslog-haproxy.mod
Viimeisenä askeleena lataat luodun paketin Linux-ytimeen komennolla semodule
:
- sudo semodule -i rsyslog-haproxy.pp
Moduulin lisääminen voi viedä muutaman sekunnin. Kun komento on valmis, voit varmistaa, että moduuli on ladattu ytimeen ajamalla komennon semodule
:
- sudo semodule -l |grep rsyslog-haproxy
Tulosteen pitäisi näyttää seuraavanlaiselta:
Outputrsyslog-haproxy
Moduulin ladattua voit käynnistää Rsyslogin uudestaan seuraavalla komennolla:
- sudo systemctl restart rsyslog
Olet nyt määrittänyt, kääntänyt ja ladannut SELinux-käytännötekniikan, joka sallii HAProxyn ja Rsyslogin kommunikoida jaetun pistorasiansa kautta.
Seuraavassa vaiheessa testaat, että kaikki toimii tekemällä HTTP-pyynnön HAProxylle ja tutkimalla sen uutta lokitiedostoa.
Vaihe 5 – HAProxy-loggauksen testaaminen
Nyt kun olet konfiguroinut HAProxyn, Rsyslogin ja valinnaisesti SELinuxin, voit testata, että lokien kirjaaminen osoitteeseen /var/log/haproxy.log
toimii.
Paketin haproxy
mukana toimitetaan oletusarvoisesti konfigurointitiedosto, joka luo HTTP-kuuntelijasokkelin porttiin 5000. Konfiguraatio osoittaa olemattomaan taustapalvelimeen, joten kaikki pyynnöt porttiin johtavat HTTP 503 -virheeseen.
Tarkistaaksesi, onko /var/log/haproxy.log
-tiedostossasi 503-virhe, luo ensin HTTP-pyyntö käyttämällä curl
seuraavasti:
- curl -si http://127.0.0.1:5000
Tulosteen pitäisi olla seuraavan kaltainen:
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>
Tarkista nyt /var/log/haproxy.log
mahdollisten HTTP 503 -vastausten varalta komennolla grep
:
- sudo grep -E 'NOSRV.+503' /var/log/haproxy.log
Huomautus: Komennon NOSRV.+503
-osa on säännöllinen lauseke. Tässä opetusohjelmassa Grep & Regular Expressions Using Grep & Regular Expressions to Search for Text Patterns in Linux
käsitellään syvällisemmin grep
ja säännöllisten lausekkeiden käyttöä.
Sinun pitäisi saada seuraavan kaltainen rivi (tai useita rivejä):
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"
Tämä rivi vastaa tekemääsi curl
-pyyntöä, mikä tarkoittaa, että Rsyslog ja HAProxy on konfiguroitu käyttämään jaettua pistorasiaa oikein.
Johtopäätös
Tämässä pikakäynnistyksen opetusohjelmassa konfiguroit HAProxyn kirjautumaan Unixin verkkotunnuksen pistorasiaan. Määritit myös Rsyslogin luomaan socketin ja lukemaan siitä, jotta nämä kaksi ohjelmaa voivat kommunikoida keskenään avaamatta mitään TCP/IP-portteja järjestelmässäsi. Lopuksi käänsit, paketoit ja latasit valinnaisesti SELinux-käytännön, joka sallii Rsyslogille ja HAProxylle jaetun pääsyn niiden socketiin.