W dzisiejszym świecie, gdzie niezawodność i dostępność usług są kluczowe, narzędzia do monitorowania systemów stają się niezbędnym elementem zarządzania infrastrukturą IT. Jednym z takich narzędzi jest Monit – wszechstronne rozwiązanie do monitorowania i zarządzania systemami Linux oraz innymi systemami z rodziny Unix. W tym artykule omówię, do czego służy Monit, jakie ma funkcje i jak można go efektywnie wykorzystać w codziennej pracy administratora systemów.
Czym jest Monit?
Jest on otwartoźródłowym narzędziem do monitorowania i zarządzania procesami, usługami oraz zasobami systemowymi na systemach Unixowych. Jego głównym zadaniem jest automatyczne monitorowanie stanu systemu oraz reagowanie na wykryte problemy. Dzięki niemu administratorzy mogą zminimalizować przestoje systemowe i zwiększyć niezawodność swoich usług.
Jego główne funkcje i zastosowania to:
Monitorowanie procesów: Monit Pozwala monitorować procesy systemowe i aplikacje, sprawdzając, czy działają poprawnie. Jeśli proces się zawiesi lub przestanie działać, Monit może go automatycznie zrestartować.
Monitorowanie zasobów systemowych: Może monitorować zużycie zasobów systemowych, takich jak pamięć, CPU, przestrzeń dyskowa, itp. Można ustawić progi, po przekroczeniu których Monit podejmie określone działania.
Monitorowanie plików i katalogów: Umożliwia monitorowanie plików i katalogów pod kątem zmian, takich jak rozmiar, modyfikacje, usunięcia czy zmiana uprawnień.
Monitorowanie usług sieciowych: Może monitorować różne usługi sieciowe, takie jak HTTP, FTP, SMTP, itp., sprawdzając ich dostępność i reagując na problemy.
Automatyczne naprawianie problemów: Jeśli wykryje problem, może automatycznie podjąć działania naprawcze, takie jak restartowanie usług, wysyłanie powiadomień do administratorów, lub uruchomienie skryptów naprawczych.
Wysyłanie powiadomień: Może wysyłać powiadomienia e-mail lub inne powiadomienia, aby informować administratorów o wykrytych problemach i podjętych działaniach.
Łatwe konfigurowanie i używanie: Jest stosunkowo łatwy do skonfigurowania i używania, dzięki czytelnej składni plików konfiguracyjnych oraz przejrzystej dokumentacji.
Instalacja Monit na Raspberry Pi 5
Instalacja Monit w systemie Linux jest prosta i można ją przeprowadzić za pomocą menedżera pakietów dostępnego w danej dystrybucji. Przykładowo, w systemie Raspberry Pi OS można to zrobić w następujący sposób:
sudo apt update
sudo apt install monit
Przykładowa konfiguracja Monit
Po zainstalowaniu Monit, następnym krokiem jest jego konfiguracja. Plik konfiguracyjny Monit jest czytelny i prosty w edycji. Oto przykład mojej konfiguracji dla Raspberry Pi 5:
set daemon 60
set logfile syslog facility log_daemon
# Konfiguracja serwera mailowego
set mailserver smtp.example.com port 587
username "your-username"
password "your-password"
using tlsv1.2
# E-mail, na który będą wysyłane alerty
set alert your-email@example.com
set httpd port 2812 and SSL ENABLE PEMFILE /var/certs/monit.pem
allow admin:twojehasło
# minitorowanie load serwera
check system $HOST
if loadavg (1min) > 3.8 then alert
check process sshd with pidfile /var/run/sshd.pid
start program "/usr/sbin/service ssh start"
stop program "/usr/sbin/service ssh stop"
if failed port 22 protocol ssh then restart
if 5 restarts within 5 cycles then timeout
check process apache with pidfile /var/run/apache2/apache2.pid
group www-data
start program = "/usr/sbin/service apache2 start" with timeout 60 seconds
stop program = "/usr/sbin/service apache2 stop"
if cpu is greater than 60% for 2 cycles then alert
if cpu > 80% for 5 cycles then restart
if totalmem > 500 MB for 5 cycles then restart
if children > 250 then restart
# if loadavg(5min) greater than 4 for 8 cycles then stop
if failed port 80 protocol http with timeout 15 seconds then restart
if failed port 443 protocol https with timeout 15 seconds then restart
if 3 restarts within 5 cycles then timeout
check process mysql with pidfile /var/run/mysqld/mysqld.pid
group database
start program = "/usr/sbin/service mysql start"
stop program = "/usr/sbin/service mysql stop"
if failed host 127.0.0.1 port 3306 then restart
if 5 restarts within 5 cycles then timeout
#check process proftpd with pidfile /var/run/proftpd.pid
# start program = "/usr/sbin/service proftpd start"
# stop program = "/usr/sbin/service proftpd stop"
# if failed port 21 protocol ftp then restart
# if 5 restarts within 5 cycles then timeout
#
#check process postfix with pidfile /var/spool/postfix/pid/master.pid
# group mail
# start program = "/usr/sbin/service postfix start"
# stop program = "/usr/sbin/service postfix stop"
# if failed port 25 protocol smtp then restart
# if 5 restarts within 5 cycles then timeout
#
#check process nginx with pidfile /var/run/nginx.pid
# start program = "/usr/sbin/service nginx start"
# stop program = "/usr/sbin/service nginx stop"
# if failed host 127.0.0.1 port 80 then restart
#
# redis
check process redis with pidfile /var/run/redis/redis-server.pid
group cache
group redis
start program = "/usr/sbin/service redis-server start" with timeout 60 seconds
stop program = "/usr/sbin/service redis-server stop" with timeout 60 seconds
if failed host 127.0.0.1 port 6379 then restart
if totalmem > 500 Mb then alert
if cpu > 60% for 2 cycles then alert
if cpu > 98% for 5 cycles then restart
if 2 restarts within 2 cycles then alert
depend redis_bin
depend redis_rc
check file redis_bin with path /usr/bin/redis-server
group redis
include /etc/monit/templates/rootbin
check file redis_rc with path /etc/init.d/redis-server
group redis
include /etc/monit/templates/rootbin
check process fail2ban with pidfile /var/run/fail2ban/fail2ban.pid
group services
start program = "/etc/init.d/fail2ban force-start"
stop program = "/etc/init.d/fail2ban stop"
if failed unixsocket /var/run/fail2ban/fail2ban.sock then restart
if 5 restarts within 5 cycles then timeout
check file fail2ban_log with path /var/log/fail2ban.log
if match "ERROR|WARNING" then alert
#
check process pureftpd with pidfile /var/run/pure-ftpd/pure-ftpd.pid
start program = "/usr/sbin/service pure-ftpd-mysql start"
stop program = "/usr/sbin/service pure-ftpd-mysql stop"
if failed port 21 protocol ftp then restart
if 5 restarts within 5 cycles then timeout
#
check process named with pidfile /var/run/named/named.pid
start program = "/usr/sbin/service bind9 start"
stop program = "/usr/sbin/service bind9 stop"
if failed host 127.0.0.1 port 53 type tcp protocol dns then restart
if failed host 127.0.0.1 port 53 type udp protocol dns then restart
if 5 restarts within 5 cycles then timeout
#
#check process ntpd with pidfile /var/run/ntpd.pid
# start program = "/usr/sbin/service ntp start"
# stop program = "/usr/sbin/service ntp stop"
# if failed host 127.0.0.1 port 123 type udp then restart
# if 5 restarts within 5 cycles then timeout
#
#check process amavisd with pidfile /var/run/amavis/amavisd.pid
# group mail
# start program = "/usr/sbin/service amavis start"
# stop program = "/usr/sbin/service amavis stop"
# if failed port 10024 protocol smtp then restart
# if 5 restarts within 5 cycles then timeout
#
#check process courier-imap with pidfile /var/run/courier/imapd.pid
# group mail
# start program = "/usr/sbin/service courier-imap start"
# stop program = "/usr/sbin/service courier-imap stop"
# if failed host localhost port 143 type tcp protocol imap then restart
# if 5 restarts within 5 cycles then timeout
#
#check process courier-imap-ssl with pidfile /var/run/courier/imapd-ssl.pid
# group mail
# start program = "/usr/sbin/service courier-imap-ssl start"
# stop program = "/usr/sbin/service courier-imap-ssl stop"
# if failed host localhost port 993 type tcpssl sslauto protocol imap then restart
# if 5 restarts within 5 cycles then timeout
#
#check process courier-pop3 with pidfile /var/run/courier/pop3d.pid
# group mail
# start program = "/usr/sbin/service courier-pop start"
# stop program = "/usr/sbin/service courier-pop stop"
# if failed host localhost port 110 type tcp protocol pop then restart
# if 5 restarts within 5 cycles then timeout
#
#check process courier-pop3-ssl with pidfile /var/run/courier/pop3d-ssl.pid
# group mail
# start program = "/usr/sbin/service courier-pop-ssl start"
# stop program = "/usr/sbin/service courier-pop-ssl stop"
# if failed host localhost port 995 type tcpssl sslauto protocol pop then restart
# if 5 restarts within 5 cycles then timeout
#
#check process dovecot with pidfile /var/run/dovecot/master.pid
# group mail
# start program = "/usr/sbin/service dovecot start"
# stop program = "/usr/sbin/service dovecot stop"
# if failed host localhost port 143 type tcp protocol imap then restart
# if 5 restarts within 5 cycles then timeout
check process php5.6-fpm with pidfile /var/run/php/php5.6-fpm.pid
group php-fpm #change accordingly
start program = "/etc/init.d/php5.6-fpm start"
stop program = "/etc/init.d/php5.6-fpm stop"
if failed unixsocket /var/run/php/php5.6-fpm.sock then restart
if 3 restarts within 5 cycles then timeout
check process php7.2-fpm with pidfile /var/run/php/php7.2-fpm.pid
group php-fpm #change accordingly
start program = "/etc/init.d/php7.2-fpm start"
stop program = "/etc/init.d/php7.2-fpm stop"
if failed unixsocket /var/run/php/php7.2-fpm.sock then restart
if 3 restarts within 5 cycles then timeout
check process php7.3-fpm with pidfile /var/run/php/php7.3-fpm.pid
group php-fpm #change accordingly
start program = "/etc/init.d/php7.3-fpm start"
stop program = "/etc/init.d/php7.3-fpm stop"
if failed unixsocket /var/run/php/php7.3-fpm.sock then restart
if 3 restarts within 5 cycles then timeout
check process php7.4-fpm with pidfile /var/run/php/php7.4-fpm.pid
group php-fpm #change accordingly
start program = "/etc/init.d/php7.4-fpm start"
stop program = "/etc/init.d/php7.4-fpm stop"
if failed unixsocket /var/run/php/php7.4-fpm.sock then restart
if 3 restarts within 5 cycles then timeout
check process php8.0-fpm with pidfile /var/run/php/php8.0-fpm.pid
group php-fpm #change accordingly
start program = "/etc/init.d/php8.0-fpm start"
stop program = "/etc/init.d/php8.0-fpm stop"
if failed unixsocket /var/run/php/php8.0-fpm.sock then restart
if 3 restarts within 5 cycles then timeout
check process php8.1-fpm with pidfile /var/run/php/php8.1-fpm.pid
group php-fpm #change accordingly
start program = "/etc/init.d/php8.1-fpm start"
stop program = "/etc/init.d/php8.1-fpm stop"
if failed unixsocket /var/run/php/php8.1-fpm.sock then restart
if 3 restarts within 5 cycles then timeout
check process php8.2-fpm with pidfile /var/run/php/php8.2-fpm.pid
group php-fpm #change accordingly
start program = "/etc/init.d/php8.2-fpm start"
stop program = "/etc/init.d/php8.2-fpm stop"
if failed unixsocket /var/run/php/php8.2-fpm.sock then restart
if 3 restarts within 5 cycles then timeout
check process php8.3-fpm with pidfile /var/run/php/php8.3-fpm.pid
group php-fpm #change accordingly
start program = "/etc/init.d/php8.3-fpm start"
stop program = "/etc/init.d/php8.3-fpm stop"
if failed unixsocket /var/run/php/php8.3-fpm.sock then restart
if 3 restarts within 5 cycles then timeout
check process php8.4-fpm with pidfile /var/run/php/php8.4-fpm.pid
group php-fpm #change accordingly
start program = "/etc/init.d/php8.4-fpm start"
stop program = "/etc/init.d/php8.4-fpm stop"
if failed unixsocket /var/run/php/php8.4-fpm.sock then restart
if 3 restarts within 5 cycles then timeout
# Monitorowanie Samby
check process smbd with pidfile /var/run/samba/smbd.pid
group samba
start program = "/etc/init.d/smbd start"
stop program = "/etc/init.d/smbd stop"
if failed host localhost port 445 type TCP then restart
# Monitorowanie NFS
check process NFS with pidfile /var/run/rpc.statd.pid
start program = "/etc/init.d/nfs-kernel-server start"
stop program = "/etc/init.d/nfs-kernel-server stop"
if failed host 127.0.0.1 port 2049 type tcp for 2 cycles then restart
if 2 restarts within 3 cycles then unmonitor
# Monitorowanie temperatury CPU
check program cpu_temperature with path "/etc/monit/custommodules/picputemp"
with timeout 5 seconds
if status != 0 then alert
# temp dysku
check program nvme_temperature with path "/etc/monit/custommodules/hdtemp"
every 5 cycles
if status != 0 then alert
group health
# Monitorowanie miejsca na dysku
check filesystem rootfs with path /
if space usage > 95% then alert
# Monitorowanie zuzycia dysku
check program nvme_smart with path "/etc/monit/custommodules/check_nvme_smart"
if status != 0 then alert
# Monitorowanie maldet - antymalware
check program maldet with path "/usr/local/sbin/maldet --monitor /var/www /home /etc"
if status != 0 then alert
# Pojemnośc dysku
check program root_nvme with path "/etc/monit/custommodules/disk_space"
if status != 0 then alert
# Zajętość katalogu /home/nas
check program home_nas with path "/etc/monit/custommodules/nas_space"
every 60 cycles
if status > 250 then alert
Standardowo monitorowane usługi sprawdzane są co 1 minutę. Temperatury dysku i katalogu serwera NAS, nie ma jednak sensu monitorować co minutę. Z tego powodu moduł do monitoringu temperatury dysku uruchamiany jest raz na 5 minut – every 5 cycles. Zajętość katalogu nas uruchamiany jest raz na 1 godzinę – every 60 cycles.
1 cycles, to 1 minuta w niniejszej konfiguracji. Osoby, które dość mocno korzystają z serwera NAS i których katalog NAS często się zmienia, mogą ten czas skrócić np. do 30 min lub 15 min.
plik konfiguracyjny jaki należy zmodyfikować to: /etc/monit/monitrc
Ustaw konfigurację serwera mailowego z jakiego mają być wysyłane alerty. Kolejno Nazwa serwera poczty wychodzącej, użytkownik i hasło, a następnie adres email na jaki mają dochodzić alerty.
Zmień także admin:twojehasło w powyższym pliku konfiguracyjnym, aby ustawić własny login i hasło do panelu Monit. Pierwsza fraza przed dwukropkiem to login, druga fraza za dwukropkiem to hasło jakim się będziesz logował do Monit.
Następnie pobierz i zainstaluj moduły odpowiedzialne za wyświetlanie niektórych wyników, użytych w powyższym przykładzie pliku konfiguracyjnego Monit.
Uwaga: Możesz użyć gotowego pliku binarnego jeśli nie zamierzasz modyfikować żadnych parametrów. Jeśli chcesz zmodyfikować dany parametr lub użyć go na maszynie innej niż raspberry pi (procesor ARM), pobierz Kod źródłowy i skompiluj go samodzielnie (polecenie jakie należy użyć do kompilacji, umieściłem w komentarzu w pliku z kodem źródłowym danego modułu).
Monitorowanie temperatury procesora
Moduł i krótka instrukcja instalacji
picputemp-temperatura-procesora
Monitorowanie temperatury dysku
Moduł i krótka instrukcja instalacji
hdtemp-monitorowanie-temperatury-dysku
Monitorowanie zużycia dysku nvme
Moduł i krótka instrukcja instalacji
check_nvme_smart-monitoring-kondycji-dysku-twardego
Monitorowanie pojemności dysku, zajętości i dostępnego miejsca na dysku
Pobierz i do katalogu /etc/monit/customscripts/ skopiuj jeden z poniższych plików
Plik binarny
Kod źródłowy
Skrypt .ssh
Monitorowanie zajętości NAS
Moduł i krótka instrukcja instalacji
nas_space-pokazuje-zajetosc-miejsca-w-katalogu
Moduły napisane zostały w taki sposób, aby ich pliki binarne jak najmniej obciążały procesor.
Jest to główny powód, dla którego zdecydowałem się przepisać kod do C++ i skompilować je do plików binarnych. To jest niezaprzeczalna zaleta takiego rozwiązania w przeciwieństwie do zwykłych skryptów bash lub perl. Wadą natomiast jest to, że gdy będziemy chcieli zmienić coś w konfiguracji takiego pliku (np. ścieżki dostępu, nazwę dysku itp.) to będziemy musieli zrobić to w pliku z kodem źródłowym i po dokonaniu zmian skompilować go na nowo.
Szablony wykorzystywane w pliku konfiguracyjnym monit
Pobierz i skopiuj do katalogu /etc/monit/templates/ wszystkie poniższe pliki
rootbin
rootrc
rootstrict
Wygeneruj certyfikat ssl
Wykonaj poniższe polecenia
mkdir /var/certs
cd /var/certs
touch monit.cnf
Następnie do monit.cnf wpisz poniższą zawartość
# create RSA certs - Server
RANDFILE = ./openssl.rnd
[ req ]
default_bits = 2048
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
[ req_dn ]
countryName = Country Name (2 letter code)
countryName_default = MO
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Monitoria
localityName = Locality Name (eg, city)
localityName_default = Monittown
organizationName = Organization Name (eg, company)
organizationName_default = Monit Inc.
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = Dept. of Monitoring Technologies
commonName = Common Name (FQDN of your server)
commonName_default = server.monit.mo
emailAddress = Email Address
emailAddress_default = root@monit.mo
[ cert_type ]
nsCertType = server
Zapisz plik i w konsoli wpisz
openssl req -new -x509 -days 365 -nodes -config ./monit.cnf -out /var/certs/monit.pem -keyout /var/certs/monit.pem
openssl dhparam 1024 >> /var/certs/monit.pem
openssl x509 -subject -dates -fingerprint -noout -in /var/certs/monit.pem
chmod 600 /var/certs/monit.pem
Zrestartuj Monit wpisując w konsoli
systemctl stop monit
systemctl start monit
Na koniec odblokuj port 2812 na swoim firewallu tak jak to opisywałem w poprzednich częściach tutoriala.
Do panelu Monit możesz wejść wpisując w przeglądarce https://twój-zewnętrzny-ip:2812
Podsumowanie
Monit to potężne i wszechstronne narzędzie do monitorowania i zarządzania systemami Linux. Dzięki swojej elastyczności, łatwości konfiguracji i zdolności do automatycznego naprawiania problemów, jest niezastąpionym elementem infrastruktury IT. Niezależnie od tego, czy zarządzasz małym serwerem, czy dużą infrastrukturą, może znacząco poprawić niezawodność i dostępność Twoich usług.
cz. 1 Raspberry Pi 5: Niezbędne Akcesoria do Uruchomienia Własnego Serwera WWW
cz. 2 Instalacja Apache, MySQL, PHP na Raspberry Pi 5
cz. 3 Konfiguracja DNS dla Serwera WWW na Raspberry Pi 5
cz. 4 ISPConfig3 na Raspberry Pi 5: Instalacja i Konfiguracja Panelu Hostingowego
cz. 5 Optymalizacja Stron hostowanych na Raspberry Pi 5: Jak Przyspieszyć stronę WWW
cz. 6 Bezpieczeństwo Serwera WWW na Raspberry Pi 5: Konfiguracja Zabezpieczeń
cz. 7 Jak skonfigurować Cloudflare pod serwer WWW na Raspberry Pi 5 Praktyczny poradnik
cz. 9 Własny NAS: Serwer www na Raspberry Pi5
cz. 10 Serwer internetowy na Raspberry Pi 5 — 6 miesięcy testów i optymalizacji