Cảnh báo trang web ngừng hoạt động
Cách biết về tình trạng dịch vụ không khả dụng trước cả người dùng: kiểm tra bên ngoài, một watchdog đơn giản trên chính máy chủ, và tự động khởi động lại dịch vụ.
Cập nhật 23 tháng 8, 2026
Biểu đồ trong bảng điều khiển hiển thị trạng thái của máy, nhưng chúng không trả lời câu hỏi “site có đang hoạt động không?”. Ứng dụng có thể bị treo trong khi CPU đang rảnh, và nếu không có kiểm tra từ bên ngoài, bạn sẽ biết về điều đó từ khách hàng của mình.
Kiểm tra từ bên ngoài
Nguyên tắc chính: đừng kiểm tra từ chính máy bạn đang giám sát. Hãy dùng bất kỳ dịch vụ giám sát uptime bên ngoài nào — có rất nhiều dịch vụ, kể cả gói miễn phí cho vài địa chỉ với khoảng thời gian một phút. Những cài đặt thực sự quan trọng:
- Địa chỉ kiểm tra. Không phải trang chủ, mà là một route riêng như
/healthzđể kiểm tra cả cơ sở dữ liệu lẫn hàng đợi. Nếu không, một trang chủ đã được cache vẫn sẽ được phục vụ ngay cả khi backend đã chết. - Phản hồi mong đợi. Mã 200 kèm một chuỗi con trong body. Nhiều ứng dụng trả về 200 với thông báo lỗi khi chúng hỏng.
- Ngưỡng. Hai hoặc ba lần thất bại liên tiếp, nếu không thì bất kỳ trục trặc mạng nào cũng sẽ đánh thức bạn.
- Kênh. Telegram hoặc email. Hãy đảm bảo cảnh báo thực sự đến: tắt dịch vụ trong một phút và chờ tin nhắn.
Đừng quên kiểm tra riêng ngày hết hạn của chứng chỉ — một chứng chỉ TLS hết hạn trông giống như sự cố ngừng hoạt động và xảy ra thường xuyên.
Watchdog trên chính máy
Giám sát bên ngoài sẽ cho bạn biết rằng site đã ngừng hoạt động. Để nó tự khởi động lại, hãy cấu hình systemd. Trong service unit:
[Service]
Restart=always
RestartSec=5
StartLimitBurst=5
StartLimitIntervalSec=120
Như vậy dịch vụ sẽ sống sót qua một lần crash bất ngờ, nhưng sẽ không lặp vô hạn nếu cấu hình bị hỏng. Sau khi chỉnh sửa: systemctl daemon-reload && systemctl restart myapp.
Với những ứng dụng không crash mà bị treo, hãy thêm kiểm tra HTTP. Một cặp unit — một timer và một service:
cat >/etc/systemd/system/healthcheck.service <<'EOF'
[Service]
Type=oneshot
ExecStart=/usr/local/bin/healthcheck.sh
EOF
cat >/etc/systemd/system/healthcheck.timer <<'EOF'
[Timer]
OnUnitActiveSec=60
[Install]
WantedBy=timers.target
EOF
systemctl enable --now healthcheck.timer
Bản thân script:
#!/bin/sh
curl -fsS --max-time 10 http://127.0.0.1:8080/healthz >/dev/null || systemctl restart myapp
Cảnh báo về tình trạng máy
Cũng hữu ích khi biết về việc hết dung lượng đĩa và bộ nhớ trước khi xảy ra sự cố ngừng hoạt động. Cách đơn giản nhất là một cron job gửi tin nhắn Telegram khi vượt ngưỡng:
0 * * * * root [ "$(df --output=pcent / | tr -dc 0-9)" -gt 85 ] && curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" -d chat_id=$CHAT -d text="VDS disk usage is over 85%"
Một lựa chọn nâng cao hơn với các ngưỡng có sẵn được cung cấp bởi Netdata.
Những lỗi thường gặp
- Giám sát trên cùng một máy. Nếu máy gặp sự cố, cả watchdog lẫn hệ thống cảnh báo đều chết.
- Ngưỡng quá nhạy. Một chuỗi cảnh báo giả nghĩa là bạn sẽ bỏ qua cảnh báo thật.
Restart=alwaysthay vì điều tra nguyên nhân. Khởi động lại che giấu một rò rỉ bộ nhớ: dịch vụ crash mỗi nửa giờ, và bạn không hề thấy. Hãy kiểm trasystemctl show myapp -p NRestartsvà journal.- Chỉ kiểm tra bằng ping. Máy vẫn phản hồi ICMP ngay cả khi web server đã chết hoàn toàn.
Việc đầu tiên cần kiểm tra khi có cảnh báo là “Overview” trong bảng điều khiển
/hosting/vds/m/<id>. Biểu đồ bị đứt đoạn nghĩa là có vấn đề với máy; biểu đồ phẳng lì khi site không truy cập được nghĩa là có vấn đề trong ứng dụng.