ติดตั้ง Grafana + Prometheus บน VPS Ubuntu Monitor Real-time

การ Monitor เซิร์ฟเวอร์เป็นสิ่งจำเป็นสำหรับทุก VPS ที่รันงาน production บทความนี้จะพาคุณติดตั้ง Grafana และ Prometheus ซึ่งเป็น open-source monitoring stack ที่ทรงพลังที่สุดในปัจจุบัน คุณจะได้ Dashboard สวยงามแสดง CPU, RAM, Disk และ Network แบบ real-time พร้อมระบบแจ้งเตือนอัตโนมัติ

Grafana และ Prometheus คืออะไร

ก่อนเริ่มติดตั้ง มาทำความเข้าใจ architecture ของระบบนี้:

Data flow: Node Exporter (port 9100) → Prometheus scrape (port 9090) → Grafana visualize (port 3000)

ข้อกำหนด

ก่อนเริ่มติดตั้ง ตรวจสอบสิ่งเหล่านี้:

ติดตั้ง 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.target
sudo 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_exporter
sudo 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.target
sudo 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

  1. ไปที่ Configuration → Data Sources
  2. คลิก Add data source เลือก Prometheus
  3. ใส่ URL: http://localhost:9090
  4. คลิก Save & Test — ควรแสดง "Data source is working"

Import Dashboard Node Exporter Full (ID 1860)

Grafana.com มี pre-built dashboard สำหรับ Node Exporter ที่แสดงข้อมูลครบสมบูรณ์:

  1. ไปที่ Dashboards → Import
  2. ใส่ Dashboard ID: 1860
  3. คลิก Load
  4. เลือก Prometheus data source ที่สร้างไว้
  5. คลิก Import

คุณจะเห็น Dashboard แสดง CPU usage, memory utilization, disk I/O, network bandwidth และอีกหลายร้อย metrics ทันที โดยไม่ต้องสร้าง query เอง

ติดตั้ง Exporter เพิ่มเติมสำหรับ Application Monitoring

Node Exporter ดูแลเฉพาะ OS metrics แต่หาก VPS ของคุณรัน service เฉพาะ สามารถเพิ่ม Exporter ได้ตามความต้องการ:

ทุก 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

  1. สร้าง Telegram Bot ผ่าน @BotFather รับ Token
  2. ไปที่ Alerting → Contact Points → New contact point
  3. เลือก Telegram ใส่ Bot Token และ Chat ID
  4. สร้าง 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 มีดังนี้:

ค่าเหล่านี้เป็นจุดเริ่มต้น ควรปรับตาม workload จริงของแต่ละ VPS หลังจาก Monitor ไปสักสัปดาห์หนึ่งเพื่อดูว่า baseline ปกติของระบบอยู่ที่ระดับไหน

ตัวอย่าง Use Case: Monitor เว็บไซต์ WordPress

สถานการณ์จริงที่พบบ่อยคือการ Monitor VPS ที่รัน WordPress ซึ่งมี traffic ขึ้นลงตามเวลา การตั้งค่า Grafana + Prometheus ช่วยให้เห็นภาพรวมได้ชัดเจน:

ข้อมูลเชิงลึกเหล่านี้ทำให้สามารถตัดสินใจได้อย่างมีข้อมูลสนับสนุน แทนที่จะ 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