
การ Monitor เซิร์ฟเวอร์เป็นสิ่งจำเป็นสำหรับทุก VPS ที่รันงาน production บทความนี้จะพาคุณติดตั้ง Grafana และ Prometheus ซึ่งเป็น open-source monitoring stack ที่ทรงพลังที่สุดในปัจจุบัน คุณจะได้ Dashboard สวยงามแสดง CPU, RAM, Disk และ Network แบบ real-time พร้อมระบบแจ้งเตือนอัตโนมัติ
Grafana และ Prometheus คืออะไร
ก่อนเริ่มติดตั้ง มาทำความเข้าใจ architecture ของระบบนี้:
- Prometheus — Time-series database ที่ทำหน้าที่ scrape (ดึง) metrics จาก exporter ต่างๆ ตามระยะเวลาที่กำหนด (ค่า default คือทุก 15 วินาที) แล้วเก็บข้อมูลไว้ในรูปแบบ time-series
- Node Exporter — Agent ขนาดเล็กที่ติดตั้งบนเซิร์ฟเวอร์ ทำหน้าที่รวบรวม metrics ของ OS เช่น CPU usage, memory, disk I/O และ network traffic แล้ว expose ไว้ที่ port 9100
- Grafana — Visualization platform ที่เชื่อมต่อกับ Prometheus เป็น data source แล้วแสดงผลเป็น Dashboard กราฟสวยงาม รองรับการตั้ง Alert Rules และส่งการแจ้งเตือน
Data flow: Node Exporter (port 9100) → Prometheus scrape (port 9090) → Grafana visualize (port 3000)
ข้อกำหนด
ก่อนเริ่มติดตั้ง ตรวจสอบสิ่งเหล่านี้:
- VPS Ubuntu 20.04 LTS หรือ 22.04 LTS
- RAM อย่างน้อย 1 GB (แนะนำ 2 GB ขึ้นไปเพื่อ performance ที่ดี)
- Ports ที่ต้องเปิด: 9090 (Prometheus), 3000 (Grafana), 9100 (Node Exporter)
- Root หรือ sudo access
ติดตั้ง Prometheus
ดาวน์โหลด Prometheus binary จาก GitHub Releases แล้วตั้งค่า systemd service:
# สร้าง user สำหรับ Prometheus
sudo useradd --no-create-home --shell /bin/false prometheus
# ดาวน์โหลด Prometheus
PROM_VER="2.52.0"
wget https://github.com/prometheus/prometheus/releases/download/v${PROM_VER}/prometheus-${PROM_VER}.linux-amd64.tar.gz
tar xzf prometheus-${PROM_VER}.linux-amd64.tar.gz
cd prometheus-${PROM_VER}.linux-amd64
# คัดลอกไฟล์
sudo cp prometheus /usr/local/bin/
sudo cp promtool /usr/local/bin/
sudo mkdir /etc/prometheus /var/lib/prometheus
sudo cp -r consoles/ console_libraries/ /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheusสร้าง systemd service file:
sudo nano /etc/systemd/system/prometheus.service[Unit]
Description=Prometheus Monitoring
After=network.target
[Service]
User=prometheus
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus \
--storage.tsdb.retention.time=30d \
--web.listen-address=0.0.0.0:9090
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable prometheus
sudo systemctl start prometheus
sudo systemctl status prometheusทำความเข้าใจ PromQL สำหรับเริ่มต้น
PromQL (Prometheus Query Language) คือภาษา query ที่ใช้ดึงข้อมูล metrics จาก Prometheus เพื่อแสดงบน Grafana Dashboard แม้จะดูซับซ้อนในตอนแรก แต่ query พื้นฐานที่ใช้งานบ่อยที่สุดมีไม่กี่รูปแบบ:
| Metric | PromQL Query | คำอธิบาย |
|---|---|---|
| CPU Usage % | 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) | % CPU ที่ใช้งานในช่วง 5 นาทีล่าสุด |
| RAM Usage % | (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 | % RAM ที่ใช้งานอยู่ |
| Disk Free % | (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 | % Disk ที่ว่างอยู่บน root partition |
| Network In | rate(node_network_receive_bytes_total{device="eth0"}[5m]) | Traffic ขาเข้าต่อวินาที (bytes) |
แม้จะไม่จำเป็นต้องเขียน PromQL เองเมื่อใช้ Dashboard ID 1860 แต่การเข้าใจพื้นฐานช่วยให้ปรับแต่ง Panel ได้ตรงตามความต้องการ
ติดตั้ง Node Exporter
Node Exporter จะรวบรวม metrics ของ OS ให้ Prometheus ดึงข้อมูล:
NODE_VER="1.8.1"
wget https://github.com/prometheus/node_exporter/releases/download/v${NODE_VER}/node_exporter-${NODE_VER}.linux-amd64.tar.gz
tar xzf node_exporter-${NODE_VER}.linux-amd64.tar.gz
sudo cp node_exporter-${NODE_VER}.linux-amd64/node_exporter /usr/local/bin/
sudo useradd --no-create-home --shell /bin/false node_exportersudo nano /etc/systemd/system/node_exporter.service[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporterตั้งค่า Prometheus Scrape Config
แก้ไขไฟล์ /etc/prometheus/prometheus.yml ให้ Prometheus รู้ว่าต้อง scrape จาก Node Exporter:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['localhost:9100']sudo systemctl restart prometheus
# ตรวจสอบที่ http://YOUR_VPS_IP:9090/targets
# ทั้ง 2 targets ควรแสดงสถานะ UPติดตั้ง Grafana
ใช้ official APT repository ของ Grafana เพื่อความสะดวกในการอัพเดต:
sudo apt-get install -y apt-transport-https software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install -y grafana
sudo systemctl daemon-reload
sudo systemctl enable grafana-server
sudo systemctl start grafana-serverเปิดเบราว์เซอร์แล้วไปที่ http://YOUR_VPS_IP:3000 login ด้วย username admin และ password admin (จะถูกขอให้เปลี่ยน password ทันที)
เชื่อม Grafana กับ Prometheus Data Source
- ไปที่ Configuration → Data Sources
- คลิก Add data source เลือก Prometheus
- ใส่ URL:
http://localhost:9090 - คลิก Save & Test — ควรแสดง "Data source is working"
Import Dashboard Node Exporter Full (ID 1860)
Grafana.com มี pre-built dashboard สำหรับ Node Exporter ที่แสดงข้อมูลครบสมบูรณ์:
- ไปที่ Dashboards → Import
- ใส่ Dashboard ID: 1860
- คลิก Load
- เลือก Prometheus data source ที่สร้างไว้
- คลิก Import
คุณจะเห็น Dashboard แสดง CPU usage, memory utilization, disk I/O, network bandwidth และอีกหลายร้อย metrics ทันที โดยไม่ต้องสร้าง query เอง
ติดตั้ง Exporter เพิ่มเติมสำหรับ Application Monitoring
Node Exporter ดูแลเฉพาะ OS metrics แต่หาก VPS ของคุณรัน service เฉพาะ สามารถเพิ่ม Exporter ได้ตามความต้องการ:
- MySQL/MariaDB Exporter — Monitor query throughput, slow query, connections; รัน binary แล้วเพิ่ม job ใน prometheus.yml
- Nginx Exporter — Monitor request rate, active connections, error rate ผ่าน stub_status module
- Blackbox Exporter — Probe HTTP/TCP endpoints ตรวจว่าเว็บไซต์ตอบสนองปกติ; เหมาะสำหรับ external health check
- Redis Exporter — Monitor hit rate, memory usage, connected clients สำหรับ Redis cache
ทุก Exporter จะ expose metrics ที่ port ของตัวเอง แล้วเพิ่ม entry ใน scrape_configs ของ prometheus.yml:
# ตัวอย่างเพิ่ม Nginx Exporter
- job_name: 'nginx'
static_configs:
- targets: ['localhost:9113']
# ตัวอย่างเพิ่ม MySQL Exporter
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104']ตั้ง Alert Rules และ Notification Channel
ตั้งค่าการแจ้งเตือนเมื่อ CPU หรือ Memory ใช้งานสูงเกิน threshold:
แจ้งเตือนทาง Email
# แก้ /etc/grafana/grafana.ini
[smtp]
enabled = true
host = smtp.gmail.com:587
user = [email protected]
password = your_app_password
from_address = [email protected]แจ้งเตือนทาง Telegram
- สร้าง Telegram Bot ผ่าน @BotFather รับ Token
- ไปที่ Alerting → Contact Points → New contact point
- เลือก Telegram ใส่ Bot Token และ Chat ID
- สร้าง Alert Rule ใน Dashboard panel ที่ต้องการ เช่น CPU > 85% เป็นเวลา 5 นาที
เคล็ดลับ: ใช้ Dashboard ID 1860 "Node Exporter Full" จาก Grafana.com — dashboard สำเร็จรูปนี้มีกราฟ metrics กว่า 200 รายการ ไม่ต้องตั้งค่า PromQL เอง เหมาะที่สุดสำหรับการเริ่มต้น Monitor VPS
การกำหนด Alert Threshold ที่เหมาะสม
การตั้ง threshold ที่ดีมีความสำคัญมาก ถ้า threshold ต่ำเกินไปจะได้รับการแจ้งเตือนบ่อยครั้งจนเกิด alert fatigue และเริ่มเพิกเฉยต่อการแจ้งเตือนทั้งหมด ถ้าสูงเกินไปก็จะพลาดปัญหาจริง แนวทางที่แนะนำสำหรับ VPS ทั่วไปในการ production มีดังนี้:
- CPU Usage — เตือนเมื่อใช้งานเกิน 80% ต่อเนื่องนาน 5 นาที, Critical เมื่อเกิน 95% ต่อเนื่องนาน 2 นาที
- Memory Usage — เตือนเมื่อใช้งานเกิน 85%, Critical เมื่อเกิน 95% เพราะ Linux จะเริ่ม OOM Kill process
- Disk Usage — เตือนเมื่อใช้งานเกิน 80%, Critical เมื่อเกิน 90% เพราะ log file อาจเติมเต็ม disk อย่างรวดเร็ว
- Load Average — เตือนเมื่อ 1-minute load average เกิน 2 เท่าของจำนวน CPU core
ค่าเหล่านี้เป็นจุดเริ่มต้น ควรปรับตาม workload จริงของแต่ละ VPS หลังจาก Monitor ไปสักสัปดาห์หนึ่งเพื่อดูว่า baseline ปกติของระบบอยู่ที่ระดับไหน
ตัวอย่าง Use Case: Monitor เว็บไซต์ WordPress
สถานการณ์จริงที่พบบ่อยคือการ Monitor VPS ที่รัน WordPress ซึ่งมี traffic ขึ้นลงตามเวลา การตั้งค่า Grafana + Prometheus ช่วยให้เห็นภาพรวมได้ชัดเจน:
- ชั่วโมง Peak Traffic — ดูกราฟ CPU และ Memory ว่า server รองรับได้หรือไม่ ถ้า CPU ใกล้ 100% ต่อเนื่องหลายชั่วโมงอาจต้องพิจารณา upgrade plan หรือเพิ่ม cache
- Disk Growth Rate — ติดตามว่า Disk ถูกใช้งานเพิ่มขึ้นวันละเท่าไหร่ คำนวณได้ว่า Disk จะเต็มเมื่อไหร่เพื่อวางแผนล่วงหน้า
- Network Traffic Pattern — ถ้าเห็น traffic ขาออกสูงผิดปกติในช่วงเวลาที่ไม่มี user อาจเป็นสัญญาณว่า server ถูก compromise และใช้เป็น bot หรือ spam relay
- MySQL Connection — เมื่อติดตั้ง MySQL Exporter เพิ่ม สามารถดูจำนวน query ต่อวินาทีและ slow query ได้ ช่วยระบุ bottleneck ของ database
ข้อมูลเชิงลึกเหล่านี้ทำให้สามารถตัดสินใจได้อย่างมีข้อมูลสนับสนุน แทนที่จะ upgrade server ตามความรู้สึกว่า "น่าจะช้าแล้ว" โดยไม่มีหลักฐาน
การแก้ไขปัญหาที่พบบ่อย
ปัญหาเหล่านี้เกิดขึ้นบ่อยในช่วงแรกของการตั้งค่า Monitoring Stack:
Prometheus แสดงสถานะ DOWN ใน Targets
เมื่อเปิด http://YOUR_VPS_IP:9090/targets แล้วเห็น target แสดงสถานะ DOWN ให้ตรวจสอบตามลำดับดังนี้ ประการแรกตรวจว่า Node Exporter service กำลังทำงานด้วยคำสั่ง sudo systemctl status node_exporter ประการที่สองตรวจว่า port 9100 ไม่ถูก firewall บล็อกบน localhost ด้วย curl http://localhost:9100/metrics ประการที่สามตรวจ syntax ของไฟล์ prometheus.yml ด้วย promtool check config /etc/prometheus/prometheus.yml ถ้า YAML มี indentation ผิดจะทำให้ Prometheus โหลด config ไม่ได้
Grafana Dashboard ไม่แสดงข้อมูล
หาก Panel แสดง "No data" ให้ตรวจ Time Range ในมุมขวาบนของ Grafana ว่าครอบคลุมช่วงเวลาที่ Prometheus เก็บข้อมูลไว้ โดยทั่วไป Prometheus ต้องการเวลาอย่างน้อย 1-2 นาทีหลัง scrape ครั้งแรกก่อนที่ข้อมูลจะพร้อมแสดง หากปัญหายังคงอยู่ให้ไปที่ Configuration → Data Sources → เลือก Prometheus แล้วคลิก Save & Test เพื่อยืนยันการเชื่อมต่อ
Grafana ใช้ Memory มากเกิน
โดยค่า default Grafana เก็บ session และ plugin cache ไว้ในหน่วยความจำ ถ้า VPS มี RAM น้อยกว่า 2 GB อาจพบปัญหา OOM (Out of Memory) แก้ไขได้โดยลดจำนวน Dashboard panel ที่ refresh พร้อมกัน หรือเพิ่ม Swap Space บน VPS อีก 1-2 GB เพื่อเป็น buffer เมื่อ RAM ไม่เพียงพอในช่วงเวลาสั้นๆ
Node Exporter ไม่ start ขึ้นมา
ตรวจ log ด้วยคำสั่ง sudo journalctl -u node_exporter -n 50 สาเหตุที่พบบ่อยคือ binary ยังไม่มี execute permission ให้รัน sudo chmod +x /usr/local/bin/node_exporter หรือ user node_exporter ยังไม่ได้สร้างก่อน start service
การ Backup และจัดการข้อมูล Prometheus
Prometheus เก็บข้อมูลเป็น time-series ใน /var/lib/prometheus ซึ่งขนาดจะเติบโตตามเวลา การวางแผนจัดการข้อมูลตั้งแต่ต้นช่วยป้องกัน disk เต็ม:
กำหนด Retention Period
ค่า default ของ Prometheus เก็บข้อมูล 15 วัน แต่ค่าใน systemd service ที่ตั้งไว้ข้างต้นใช้ 30 วัน ปรับได้ตามขนาด disk ที่มี:
# ใน prometheus.service — เปลี่ยน retention ตามต้องการ
--storage.tsdb.retention.time=15d # เก็บ 15 วัน (~2-3 GB สำหรับ 1 server)
--storage.tsdb.retention.time=90d # เก็บ 90 วัน (~6-9 GB สำหรับ 1 server)
--storage.tsdb.retention.size=10GB # จำกัดขนาด (ลบข้อมูลเก่าอัตโนมัติ)Backup Prometheus Data
วิธีที่ง่ายที่สุดคือ snapshot ผ่าน Prometheus API แล้ว rsync ไปยัง storage อื่น:
# สร้าง snapshot (Prometheus ต้อง enable admin API)
curl -XPOST http://localhost:9090/api/v1/admin/tsdb/snapshot
# ดู snapshot ที่สร้าง
ls /var/lib/prometheus/snapshots/
# sync ไปยัง remote backup storage
rsync -avz /var/lib/prometheus/snapshots/ backup@backupserver:/prometheus-backup/แนะนำ Backup อย่างน้อยสัปดาห์ละครั้งและเก็บ Grafana Dashboard JSON ด้วย (Export ผ่าน Share → Export → Save to file) เพราะ Dashboard configuration ไม่ได้อยู่ใน Prometheus
เปิด Firewall และรักษาความปลอดภัย
เปิด port สำหรับ Grafana เท่านั้น (Node Exporter และ Prometheus ไม่ควร expose สู่ภายนอก):
sudo ufw allow 3000/tcp # Grafana — เปิดเฉพาะนี้
# ห้ามเปิด port 9090, 9100 สู่ public — ข้อมูล sensitive
sudo ufw reloadหากต้องการ security เพิ่มเติม ควรวาง Grafana ไว้หลัง Nginx reverse proxy พร้อม HTTPS และ basic authentication
เช่า VPS รัน Monitoring Stack
VPS AsiaGB RAM 2 GB ขึ้นไป รองรับ Grafana + Prometheus + Node Exporter ได้อย่างลื่นไหล พร้อม Uptime 99% และ SSD ความเร็วสูง
ดูแพ็กเกจ VPS