Monitorowanie serwera WWW na Raspberry Pi 5 za pomocą Monit cz. 8

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.

monit 20241012
Status nadzorowanych procesów i usług w Monit

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.

Podziel się opinią na Forum


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