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