Monit prati da servisi rade i vraća ih kada padnu. Prvo pošteno pitanje: zašto, kada systemd isto to radi jednim redom Restart=always?

Odgovor određuje ceo raspored. systemd vidi da se proces završio i ponovo ga pokreće. Ne zna da li servis odgovara na zahteve. PHP-FPM koji je dostigao granicu procesa za systemd je živ i zdrav, dok sajt vraća 502. MySQL kojem je nestalo prostora nastavlja da radi kao proces i ne izvršava nijedan upit. Monit proverava ne činjenicu da proces postoji nego njegovo ponašanje: da li port odgovara, šta vraća HTTP zahtev, koliko se memorije koristi.

Otuda pravilo: ostavite systemd kakav jeste i dodajte Monit za funkcionalne provere. Nema smisla dvostruko raditi ponovno pokretanje procesa koji se srušio.

Konfiguracija

sudo apt install monit

Glavni fajl je /etc/monit/monitrc; vaše sopstvene provere idu kao zasebni fajlovi u /etc/monit/conf.d/. Uobičajen početak:

set daemon 60
set logfile /var/log/monit.log
set mailserver localhost
set alert admin@example.com

Provera jednom u minuti razuman je balans. Češće dodaje opterećenje i podiže rizik lažnog ponovnog pokretanja zbog jednosekundnog kašnjenja.

Veb interfejs: samo lokalno

Monit ima ugrađenu veb stranicu, i obično se uključuje otprilike onako kako to pokazuje prvi vodič koji nađete — na svim adresama. Rezultat je kontrolni panel za servise servera, dostupan sa interneta. Ispravna varijanta:

set httpd port 2812 and
    use address localhost
    allow localhost
    allow admin:'a-long-password'

Pristup spolja ide preko SSH tunela:

ssh -L 2812:localhost:2812 user@203.0.113.25

Posle toga se stranica otvara na vašem računaru na localhost:2812, i ništa ne gleda napolje.

Provere koje imaju smisla

Veb server — ne po činjenici procesa nego po njegovom odgovoru:

check process nginx with pidfile /run/nginx.pid
    start program = "/bin/systemctl start nginx"
    stop program  = "/bin/systemctl stop nginx"
    if failed host 127.0.0.1 port 80 protocol http
        request "/" status = 200
        for 3 cycles then restart
    if 3 restarts within 10 cycles then unmonitor

Tri reda ovde bitnija su od ostalih.

protocol http ... status = 200 jeste provera zbog koje je sve i postavljeno: server mora da vrati stranicu, a ne samo da drži port otvorenim.

for 3 cycles znači ne reaguj na jedan jedini neuspeh. Bez toga će Monit ponovo pokrenuti servis zbog jednog sporog odgovora pod opterećenjem, što stvari samo pogoršava.

if 3 restarts within 10 cycles then unmonitor je obavezan red. Ako se servis ne diže zbog greške u konfiguraciji, Monit će ga ponovo pokretati zauvek, dodajući opterećenje i puneći dnevnike. Taj red znači: tri neuspela pokušaja, stani i ostavi poruku. Ono što je dalje potrebno jeste čovek; automatika više ne pomaže.

Prostor na disku proverava se bez ikakve automatike, prosto kao upozorenje:

check filesystem rootfs with path /
    if space usage > 85% then alert
    if inode usage > 85% then alert

Red za inode-ove potreban je posebno: oni se troše nezavisno od prostora, i bez njega ta situacija prolazi neprimećeno.

Provera konfiguracije

sudo monit -t
sudo systemctl reload monit
sudo monit summary
sudo monit status

monit -t proverava sintaksu pre nego što se primeni. monit summary daje kratku tabelu stanja — mesto odakle se kreće u ispitivanje bilo kog problema.

I proverite da li se pošta šalje. Monit prijavljuje događaje porukom, i ako isporuka nije podešena neće biti nikakvog obaveštenja: servis će se ponovo pokrenuti a vi to nećete saznati — dok su ponovljena pokretanja upravo glavni signal. Vide se i u dnevniku: /var/log/monit.log.

Šta Monit ne radi

Ne uklanja uzrok. Ponovno pokretanje je odlaganje, a servis koji se stalno ponovo pokreće znači da negde nedostaje memorije, ili nestaje prostora, ili aplikacija curi. Vrednost alata nije u ponovnom pokretanju nego u brojaču: tri ponovna pokretanja nginx-a u jednom danu dijagnoza je koja bi inače prošla neprimećeno, jer je sajt sve vreme radio.

Dakle ono što treba gledati nije trenutno stanje — ono je gotovo uvek zeleno — nego istorija: koliko se puta prethodne nedelje nešto samo diglo. Kako to izgleda na jednoj stranici pokazuje demo ispod.