Giám sát VPS với Prometheus và Grafana tự host

Mỗi khi VPS chạy WordPress bỗng chậm rì, bạn phải SSH vào xem htop rồi lại thoát ra. Không có cảnh báo trước khi RAM đầy hoặc disk I/O vọt lên, sự cố thường phát hiện khi đã muộn. Bộ đôi Prometheus và Grafana cho phép bạn tự host toàn bộ hệ thống giám sát trên chính VPS Linux của mình, thu thập metrics real-time, vẽ dashboard trực quan và gửi cảnh báo qua Telegram trước khi server tê liệt. Bài này hướng dẫn chi tiết trên Ubuntu 24.04 LTS.
Yêu cầu trước khi bắt đầu
- Một VPS chạy Ubuntu 24.04 LTS với ít nhất 2GB RAM và 20GB SSD (Prometheus + Grafana ngốn khoảng 500MB RAM, tùy số lượng target). VPS giá rẻ 2GB RAM đủ cho môi trường nhỏ.
- User
sudonon-root (hoặc root trực tiếp). - Domain trỏ về IP VPS (ví dụ:
monitor.example.com) - khuyến khích để có HTTPS cho Grafana. - Port 9090 (Prometheus), 3000 (Grafana), 9100 (Node Exporter) mở trên firewall (chỉ cho phép IP nội bộ hoặc qua reverse proxy).
Kiến trúc giám sát cơ bản
Prometheus đóng vai trò thu thập và lưu trữ metrics (dạng time-series database). Node Exporter là agent chạy trên mỗi máy chủ, expose thông số CPU/RAM/Disk/Network qua HTTP. Grafana là lớp trực quan, query dữ liệu từ Prometheus và hiển thị dashboard. Bạn có thể mở rộng thêm MySQL Exporter, Nginx Exporter khi cần. So với các dịch vụ giám sát đám mây (Datadog, New Relic), tự host bằng Prometheus + Grafana giúp bạn kiểm soát dữ liệu hoàn toàn và không phát sinh phí theo node.
Bước 1 - Cài đặt Prometheus
Prometheus không có trong apt mặc định, nên tải binary từ GitHub. Đầu tiên, tạo user và thư mục dữ liệu:
sudo useradd --no-create-home --shell /bin/false prometheus
sudo mkdir /etc/prometheus /var/lib/prometheus
Tải phiên bản mới nhất (kiểm tra trang releases):
wget https://github.com/prometheus/prometheus/releases/download/v2.54.1/prometheus-2.54.1.linux-amd64.tar.gz
tar xvf prometheus-*.tar.gz
cd prometheus-*
Copy binary và config:
sudo cp prometheus promtool /usr/local/bin/
sudo cp -r consoles console_libraries /etc/prometheus/
sudo cp prometheus.yml /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
Tạo file systemd service /etc/systemd/system/prometheus.service:
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
[Install]
WantedBy=multi-user.target
Khởi động và kiểm tra:
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus
sudo systemctl status prometheus
Output mong đợi: active (running). Mở trình duyệt http://<IP_VPS>:9090 - bạn sẽ thấy giao diện Prometheus web UI (chưa có data ngoại trừ metrics nội bộ của Prometheus).
Bước 2 - Cài đặt Node Exporter
Node Exporter chạy trên mọi VPS cần giám sát (có thể là cùng máy với Prometheus hoặc node khác). Tải binary và cấu hình tương tự:
sudo useradd --no-create-home --shell /bin/false node_exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar xvf node_exporter-*.tar.gz
sudo cp node_exporter-*/node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
File service /etc/systemd/system/node_exporter.service:
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter --web.listen-address=:9100
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
sudo systemctl status node_exporter
Verify: curl http://localhost:9100/metrics | head -20 - bạn sẽ thấy các dòng node_cpu_seconds_total, node_memory_MemTotal_bytes, v.v.
Bước 3 - Cấu hình Prometheus thu thập metrics Node Exporter
Sửa file /etc/prometheus/prometheus.yml:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
Nếu Node Exporter chạy trên server khác, thay localhost:9100 bằng IP thật (vd '10.0.0.2:9100'). Khởi động lại Prometheus:
sudo systemctl restart prometheus
Kiểm tra: vào http://<IP_VPS>:9090/targets - mục node phải hiện UP.
Bước 4 - Cài đặt Grafana
Grafana cài qua apt repository chính thức:
sudo apt-get install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install -y grafana
sudo systemctl enable --now grafana-server
sudo systemctl status grafana-server
Output: active (running). Truy cập http://<IP_VPS>:3000, đăng nhập bằng admin/admin (sẽ đổi password ngay).
Quan trọng: bạn nên đặt Grafana sau reverse proxy Nginx với Let's Encrypt SSL (tham khảo bài cấu hình Nginx reverse proxy) để truy cập an toàn qua HTTPS.
Bước 5 - Cấu hình Data source và Dashboard
Trong Grafana, vào Connections → Add new connection, chọn Prometheus. URL: http://localhost:9090 (nếu Prometheus cùng server), Access: Server (default), click Save & test. Thông báo xanh "Data source is working" là thành công.
Import dashboard: vào Dashboards → Import, nhập ID 1860 (Node Exporter Full của rfmoz) hoặc 11074 (Node Exporter Server Metrics của idealista). Click Load, chọn data source Prometheus vừa tạo, Import. Sau vài phút bạn sẽ thấy biểu đồ CPU, RAM, Disk, Network.
Mở rộng: bạn có thể thêm MySQL Exporter, Nginx Exporter, Blackbox Exporter (check HTTP/HTTPS), cấu trúc tương tự: cài agent, thêm target vào prometheus.yml.
Xử lý lỗi thường gặp
Lỗi: Grafana hiển thị "No data" trên dashboard
Kiểm tra: curl http://localhost:9090/api/v1/query?query=up - nếu trả về "result":[], Prometheus không nhận target. Vào /etc/prometheus/prometheus.yml xem dòng targets có đúng IP/port không, chạy promtool check config /etc/prometheus/prometheus.yml để debug syntax.
Lỗi: Port 3000 không truy cập được
Kiểm tra firewall: sudo ufw allow 3000/tcp (hoặc dùng firewall-cmd trên AlmaLinux/Rocky). Nếu dùng cloud provider, kiểm thêm Security Group. Cách an toàn hơn là chặn port 3000 public và dùng reverse proxy Nginx + SSL.
Lỗi: Prometheus không start sau khi sửa config
Xem log: sudo journalctl -u prometheus -n 50 --no-pager. Hay gặp lỗi indent YAML (Prometheus yêu cầu indent chính xác 2 space). Copy config mẫu từ tài liệu chính thức.
Mở rộng: Gửi cảnh báo qua Telegram
Prometheus hỗ trợ Alertmanager. Tạo file /etc/prometheus/alertmanager.yml cấu hình webhook Telegram, sau đó thêm rules vào prometheus.yml. Chi tiết có thể tham khảo bài gửi cảnh báo hệ thống qua Telegram bot để thấy cách tích hợp đơn giản hơn mà không cần Alertmanager.
Câu hỏi thường gặp
Prometheus và Grafana có tốn nhiều tài nguyên không?
Với 2-3 node giám sát, Prometheus + Grafana + Node Exporter ngốn khoảng 500MB - 1GB RAM, chủ yếu do Prometheus lưu metrics. Nên dùng VPS riêng 2GB RAM cho bộ giám sát này.
Có thể giám sát nhiều VPS cùng lúc không?
Có. Chỉ cần cài Node Exporter trên từng VPS, mở port 9100 cho phép IP của Prometheus server access, rồi thêm target vào prometheus.yml. Trên thuê VPS của bạn, có thể giám sát toàn bộ cluster từ một trung tâm.
Có cần mở port 9090/3000 ra internet không?
Không nên. Dùng reverse proxy Nginx với SSL (Let's Encrypt) cho Grafana, và giữ Prometheus port chỉ listen localhost hoặc trong private network. Bài cấu hình Nginx reverse proxy sẽ hướng dẫn chi tiết.
Grafana có hỗ trợ cảnh báo không?
Có. Grafana v8+ tích hợp sẵn Alerting engine, có thể gửi cảnh báo qua Telegram, Slack, Email mà không cần Alertmanager. Tuy nhiên với môi trường phức tạp, Prometheus Alertmanager vẫn linh hoạt hơn.
Làm sao để backup dữ liệu Prometheus?
Dùng snapshot API của Prometheus: curl -XPOST http://localhost:9090/api/v1/admin/tsdb/snapshot. Hoặc backup thư mục /var/lib/prometheus khi Prometheus đã stop. Kết hợp cronjob và script push lên S3 như bài backup VPS lên S3 với Restic.
Bài viết liên quan
- Benchmark hiệu năng VPS với FIO, Sysbench, iPerf3
- Gửi cảnh báo hệ thống VPS qua Telegram bot
- Cấu hình Nginx reverse proxy trên Ubuntu 24.04


