Monit theo dõi để các dịch vụ luôn chạy và dựng chúng dậy khi chúng sập. Câu hỏi công bằng đầu tiên: để làm gì, khi systemd làm đúng việc đó chỉ bằng một dòng Restart=always?

Câu trả lời quyết định toàn bộ cách sắp đặt. systemd thấy tiến trình đã kết thúc và khởi chạy nó lại. Nhưng nó không biết dịch vụ có trả lời các yêu cầu hay không. Một PHP-FPM đã chạm giới hạn số tiến trình vẫn sống khỏe trong mắt systemd, trong khi trang web trả về 502. Còn một MySQL hết đĩa thì vẫn chạy như một tiến trình và không thực thi nổi một truy vấn. Trong khi đó Monit không kiểm tra việc tiến trình có tồn tại hay không mà kiểm tra hành vi của nó: cổng có trả lời không, yêu cầu HTTP trả về gì, đang dùng bao nhiêu bộ nhớ.

Từ đó mà có quy tắc: hãy để systemd nguyên như vậy và thêm Monit cho các phép kiểm tra chức năng. Chẳng có ích gì khi làm trùng việc khởi động lại một tiến trình đã sập.

Cách sắp đặt

sudo apt install monit

Tệp chính là /etc/monit/monitrc; các phép kiểm tra của riêng bạn đi vào /etc/monit/conf.d/ dưới dạng tệp riêng. Phần mở đầu thường lệ:

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

Thăm dò mỗi phút một lần là cân bằng hợp lý. Thường xuyên hơn thì thêm tải và tăng nguy cơ khởi động lại nhầm chỉ vì một giây trễ.

Giao diện web: chỉ cục bộ

Monit có một trang web tích hợp, và nó thường được bật gần đúng như hướng dẫn đầu tiên tìm được chỉ dẫn — trên mọi địa chỉ. Kết quả là một bảng điều khiển các dịch vụ của máy chủ, với tới được từ Internet. Biến thể đúng:

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

Truy cập từ bên ngoài đi qua đường hầm SSH:

ssh -L 2812:localhost:2812 user@203.0.113.25

Sau đó trang mở trên chính máy tính của bạn tại localhost:2812, và chẳng có gì hướng ra ngoài.

Những phép kiểm tra có ý nghĩa

Máy chủ web — không phải qua việc tiến trình có tồn tại mà qua câu trả lời của nó:

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

Ở đây có ba dòng quan trọng hơn phần còn lại.

protocol http ... status = 200 chính là phép kiểm tra mà tất cả những thứ này được dựng lên vì nó: máy chủ phải trả về một trang, chứ không chỉ giữ một cổng mở.

for 3 cycles nghĩa là đừng phản ứng với một lần hỏng đơn lẻ. Thiếu nó thì Monit sẽ khởi động lại dịch vụ chỉ vì một lần trả lời chậm dưới tải, và điều đó chỉ làm mọi thứ tệ hơn.

if 3 restarts within 10 cycles then unmonitor là một dòng bắt buộc. Nếu dịch vụ không dựng lên được vì một lỗi cấu hình thì Monit sẽ khởi động lại nó mãi mãi, làm tăng tải và lấp đầy nhật ký. Dòng này nói rằng: ba lần thử thất bại, hãy dừng lại và để lại một thông báo. Thứ cần đến tiếp theo là một con người; tự động hóa đã hết giúp được gì.

Dung lượng đĩa được kiểm tra hoàn toàn không kèm tự động hóa, chỉ như một cảnh báo:

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

Dòng về inode cần có riêng: chúng cạn kiệt độc lập với dung lượng, và thiếu nó thì tình huống ấy trôi qua mà chẳng ai để ý.

Kiểm tra cấu hình

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

monit -t kiểm tra cú pháp trước khi áp dụng. Còn monit summary cho một bảng trạng thái ngắn gọn — nơi để bắt đầu khi xem xét bất kỳ vấn đề nào.

Và hãy kiểm tra cả việc thư có được gửi không. Monit báo cáo sự kiện qua email, và nếu việc gửi chưa được cấu hình thì sẽ chẳng có thông báo nào: dịch vụ sẽ khởi động lại còn bạn không hay biết — trong khi chính việc khởi động lại lặp đi lặp lại mới là tín hiệu chính. Chúng cũng thấy được trong nhật ký: /var/log/monit.log.

Những gì Monit không làm

Nó không loại bỏ nguyên nhân. Việc khởi động lại là một sự trì hoãn, và một dịch vụ liên tục bị khởi động lại nghĩa là ở đâu đó thiếu bộ nhớ, hoặc dung lượng đang cạn, hoặc ứng dụng bị rò rỉ. Và giá trị của công cụ không nằm ở việc khởi động lại mà ở bộ đếm: ba lần khởi động lại nginx trong một ngày là một chẩn đoán mà nếu không thì đã trôi qua chẳng ai để ý, vì trang web vẫn chạy suốt.

Vậy nên thứ cần xem không phải là trạng thái hiện tại — nó gần như luôn xanh — mà là lịch sử: tuần qua có bao nhiêu lần thứ gì đó tự dựng dậy. Trên một trang thì nó trông ra sao — xem ở demo bên dưới.