Monit, servislerin çalıştığını izler ve düştüklerinde onları geri getirir. İlk haklı soru: systemd aynısını tek bir Restart=always satırıyla yapabiliyorken neden?

Yanıt bütün kurulumu tanımlar. systemd bir sürecin sonlandığını görür ve onu yeniden başlatır. Servisin isteklere yanıt verip vermediğini bilmez. Süreç sınırına ulaşmış bir PHP-FPM, systemd açısından sapasağlamdır, oysa site 502 döndürür. Diski dolmuş bir MySQL süreç olarak çalışmaya devam eder ve tek bir sorgu çalıştırmaz. Monit bir sürecin var olduğunu değil, davranışını kontrol eder: port yanıt veriyor mu, bir HTTP isteği ne döndürüyor, ne kadar bellek kullanılıyor.

Buradan kural çıkar: systemd’yi olduğu gibi bırakın ve işlevsel kontroller için Monit ekleyin. Çökmüş bir sürecin yeniden başlatılmasını çoğaltmanın bir anlamı yoktur.

Yapılandırma

sudo apt install monit

Ana dosya /etc/monit/monitrc dosyasıdır; kendi kontrolleriniz ayrı dosyalar olarak /etc/monit/conf.d/ içine gider. Alışıldık açılış:

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

Dakikada bir yoklama makul bir dengedir. Daha sık olması yük ekler ve bir saniyelik bir gecikme yüzünden yanlış bir yeniden başlatma riskini artırır.

Web arayüzü: yalnızca yerel

Monit’in yerleşik bir web sayfası vardır ve genellikle bulunan ilk rehberin gösterdiği biçimde — bütün adreslerde — etkinleştirilir. Sonuç, internetten erişilebilen, sunucunun servisleri için bir denetim panelidir. Doğru varyant:

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

Dışarıdan erişim bir SSH tüneli üzerinden olur:

ssh -L 2812:localhost:2812 user@203.0.113.25

Bundan sonra sayfa kendi bilgisayarınızda localhost:2812 adresinde açılır ve dışarıya hiçbir şey bakmaz.

Anlamlı kontroller

Web sunucusu — bir sürecin varlığıyla değil, yanıtıyla:

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

Buradaki üç satır ötekilerden daha önemlidir.

protocol http ... status = 200, bütün bu işin uğruna kurulduğu kontroldür: sunucu yalnızca bir portu açık tutmakla kalmayıp bir sayfa döndürmelidir.

for 3 cycles, tek bir başarısızlığa tepki verme demektir. O olmadan Monit, yük altındaki tek bir yavaş yanıt yüzünden servisi yeniden başlatır ve bu işleri yalnızca kötüleştirir.

if 3 restarts within 10 cycles then unmonitor zorunlu bir satırdır. Bir servis bir yapılandırma hatası yüzünden ayağa kalkmıyorsa Monit onu sonsuza kadar yeniden başlatır, yük ekler ve günlükleri doldurur. Bu satır şu demektir: üç başarısız deneme, dur ve bir ileti bırak. Bundan sonra gereken bir insandır; otomasyonun yardımı bitmiştir.

Disk alanı hiçbir otomasyon olmadan, yalnızca bir uyarı olarak kontrol edilir:

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

inode satırı ayrıca gereklidir: onlar alandan bağımsız olarak tükenir ve o satır olmadan bu durum fark edilmeden geçer.

Yapılandırmayı kontrol etmek

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

monit -t sözdizimini uygulanmadan önce kontrol eder. monit summary durumların kısa bir tablosunu verir — herhangi bir sorunu incelemeye başlanacak yer.

Ve postanın gönderildiğini kontrol edin. Monit olayları e-postayla bildirir ve teslim yapılandırılmamışsa hiçbir bildirim olmaz: servis yeniden başlar ve siz bunu bilmezsiniz — oysa yinelenen yeniden başlatmalar tam da asıl sinyaldir. Bunlar günlükte de görülebilir: /var/log/monit.log.

Monit’in yapmadığı şey

Nedeni ortadan kaldırmaz. Yeniden başlatma bir ertelemedir ve sürekli yeniden başlatılan bir servis, bir yerde belleğin yetmediği ya da alanın tükendiği ya da uygulamanın sızdırdığı anlamına gelir. Aracın değeri yeniden başlatmada değil, sayaçtadır: bir günde üç nginx yeniden başlatması, aksi halde fark edilmeden geçecek bir teşhistir, çünkü site bu süre boyunca çalışıyordu.

Yani bakılması gereken şey neredeyse her zaman yeşil olan güncel durum değil, geçmiştir: geçen hafta boyunca kaç kez bir şey kendiliğinden ayağa kalktı. Bunun tek sayfada nasıl göründüğü aşağıdaki demoda.