Monit следи услугите да работят и ги вдига, когато паднат. Първият уместен въпрос тук: защо това, щом systemd умее същото с един ред Restart=always?

Отговорът определя цялата настройка. systemd вижда, че процесът е приключил, и го стартира наново. Той не знае дали услугата отговаря на заявки. PHP-FPM, опрял в лимита на процесите, за systemd е жив и здрав, а сайтът при това връща 502. MySQL, на който е свършило мястото, продължава да съществува като процес и не изпълнява нито една заявка. Monit проверява не факта на съществуване на процеса, а поведението му: отговаря ли портът, какво връща HTTP заявка, колко памет е заета.

Оттук правилото: systemd оставяме както си е, а Monit добавяме заради функционалните проверки. Да се дублира рестартът на паднал процес няма смисъл.

Настройка

sudo apt install monit

Основният файл е /etc/monit/monitrc, собствените проверки се слагат като отделни файлове в /etc/monit/conf.d/. Началото е обичайното:

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

Запитване веднъж в минута е разумен баланс. По-честото добавя натоварване и повишава риска от погрешен рестарт при секундно забавяне.

Уеб интерфейсът: само локално

Monit има вграден уеб интерфейс и по подразбиране се включва приблизително така, както показва първото попаднало ръководство — на всички адреси. Получава се панел за управление на услугите на сървъра, достъпен от интернет. Правилният вариант:

set httpd port 2812 and
    use address localhost
    allow localhost
    allow admin:'dulga-parola'

Достъпът отвън — през SSH тунел:

ssh -L 2812:localhost:2812 user@203.0.113.25

След това страницата се отваря на собствения компютър на адрес localhost:2812 и навън нищо не стърчи.

Проверки, които имат смисъл

Уеб сървърът — не по факта на процеса, а по отговора:

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

Три реда тук са по-важни от останалите.

protocol http ... status = 200 — точно това е проверката, заради която всичко се е започвало: сървърът е длъжен да върне страница, а не просто да държи отворен порт.

for 3 cycles — да не се реагира на единичен срив. Без това Monit ще рестартира услугата заради един бавен отговор при натоварване, с което само ще влоши положението.

if 3 restarts within 10 cycles then unmonitor — задължителен ред. Ако услугата не се вдига заради грешка в конфигурацията, Monit ще я рестартира безкрайно, добавяйки натоварване и запълвайки журналите. Този ред означава: три неуспешни опита — спри и остави съобщение. По-нататък е нужен човек, автоматиката вече не помага.

Мястото на диска се проверява без никаква автоматика, просто със съобщение:

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

Редът за inode е нужен отделно: те свършват независимо от мястото и без него тази ситуация ще остане незабелязана.

Проверка на конфигурацията

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

monit -t проверява синтаксиса преди прилагането. monit summary дава кратка таблица със състояния — с нея си струва да се започва разборът на всеки проблем.

И проверете изпращането на поща. Monit съобщава за събития с писмо и ако изпращането не е настроено, известие няма да има — услугата ще се рестартира, вие няма да разберете, а точно повтарящите се рестарти са главният сигнал. Те се виждат и в журнала: /var/log/monit.log.

Какво Monit не прави

Той не отстранява причината. Рестартът е отсрочка, а постоянно рестартирана услуга означава, че някъде не достига памет, свършва мястото или тече приложението. Стойността на инструмента не е в самия рестарт, а в брояча: три рестарта на nginx за денонощие са диагноза, която иначе би останала незабелязана, защото сайтът през цялото време е работел.

Затова трябва да се гледа не текущото състояние (то почти винаги е зелено), а историята: колко пъти за седмица нещо се е вдигнало само. Как изглежда това на една страница, показва демонстрацията по-долу.