“เซิร์ฟเวอร์ช้า” เป็นรายงานบั๊กที่ไร้ประโยชน์ เว้นแต่คุณจะเปิดกราฟแล้วเห็นว่าหน่วยความจำไต่ขึ้นมาสามวันก่อนระบบล่ม นั่นคือสิ่งที่ Prometheus และ Grafana มอบให้: CPU, RAM, ดิสก์ และเครือข่ายของทุกเซิร์ฟเวอร์ บันทึกทุก 15 วินาทีและวาดเป็นกราฟที่คุณเลื่อนย้อนหลังได้ วางมันไว้บน VPS เล็ก ๆ ของมันเอง แล้วมันจะยังเฝ้าดูต่อแม้เครื่อง production ล้มลง
ส่วนประกอบ
- node_exporter บนทุกเซิร์ฟเวอร์ที่คุณต้องการเฝ้าดู: เปิดเผยเมตริกระบบบนพอร์ต 9100
- Prometheus บน VPS มอนิเตอร์: ดึง (scrape) เมตริกเหล่านั้นมาเก็บไว้
- Grafana: แดชบอร์ด หลัง HTTPS
- ทางเลือกเสริมคือ Alertmanager หรือระบบแจ้งเตือนของ Grafana เพื่อส่งข้อความหาคุณเมื่อมีค่าเกินเกณฑ์
สิ่งที่คุณต้องมี
- Micro-IP ($10/เดือน, 2 vCPU, RAM 2 GB, 25 GB) เฝ้าดูเซิร์ฟเวอร์ได้หนึ่งถึงสองโหล ถ้ามีโฮสต์มากขึ้น เมตริกแอปแบบกำหนดเอง หรือต้องเก็บข้อมูลหลายเดือน: Small-IP
- IPv4 เฉพาะ สำหรับเซิร์ฟเวอร์มอนิเตอร์: Grafana ให้บริการผ่าน HTTPS และเครื่องเป้าหมายสามารถอนุญาตที่อยู่คงที่เพียงหนึ่งเดียวให้เข้าพอร์ต 9100
1. node_exporter บนทุกเครื่องเป้าหมาย
apt install -y prometheus-node-exporter
# allow only the monitoring server to scrape it
ufw allow from 203.0.113.10 to any port 9100 proto tcp
เปลี่ยน 203.0.113.10 เป็นที่อยู่ของ VPS มอนิเตอร์ของคุณ อย่าเปิดพอร์ต 9100 ให้ทั้งโลกเข้าถึงเด็ดขาด เพราะมันเปิดเผยข้อมูลเกี่ยวกับเซิร์ฟเวอร์ของคุณมากเกินไป
2. Prometheus และ Grafana บน VPS มอนิเตอร์
apt update && apt install -y docker.io docker-compose-v2 caddy
mkdir -p /opt/monitoring && cd /opt/monitoring
cat > prometheus.yml <<'EOF'
global:
scrape_interval: 15s
scrape_configs:
- job_name: nodes
static_configs:
- targets: ['198.51.100.21:9100', '198.51.100.22:9100']
EOF
cat > compose.yml <<'EOF'
services:
prometheus:
image: prom/prometheus
volumes: [ "./prometheus.yml:/etc/prometheus/prometheus.yml:ro", "prom:/prometheus" ]
command: [ "--config.file=/etc/prometheus/prometheus.yml", "--storage.tsdb.retention.time=15d", "--web.enable-remote-write-receiver" ]
ports: [ "127.0.0.1:9090:9090" ]
restart: unless-stopped
grafana:
image: grafana/grafana
volumes: [ "grafana:/var/lib/grafana" ]
ports: [ "127.0.0.1:3000:3000" ]
restart: unless-stopped
volumes: { prom: {}, grafana: {} }
EOF
docker compose up -d
HTTPS หน้า Grafana:
echo 'grafana.example.com {
reverse_proxy 127.0.0.1:3000
}' > /etc/caddy/Caddyfile && systemctl reload caddy
ล็อกอิน (admin / admin แล้วเปลี่ยนรหัสผ่าน) เพิ่ม Prometheus เป็นแหล่งข้อมูลที่ http://prometheus:9090 แล้วนำเข้าแดชบอร์ดชุมชน “Node Exporter Full” (ID 1860) ภายในราวหนึ่งนาทีคุณจะได้แดชบอร์ดระบบที่ครบถ้วน
เซิร์ฟเวอร์ที่ใช้แพ็กเกจ NAT
เซิร์ฟเวอร์ NAT รับการเชื่อมต่อขาเข้าเฉพาะที่พอร์ต SSH ส่วนตัว Prometheus จึงดึงข้อมูลจาก exporter ของมันไม่ได้ ให้กลับทิศทาง: รัน Prometheus ใน โหมด agent บนเครื่อง NAT แล้วผลักข้อมูลไปยังเซิร์ฟเวอร์มอนิเตอร์ ซึ่งรับการเขียนจากระยะไกลอยู่แล้ว (แฟล็ก --web.enable-remote-write-receiver ด้านบน)
# /etc/prometheus/agent.yml on the NAT server
scrape_configs:
- job_name: self
static_configs: [ { targets: ['127.0.0.1:9100'] } ]
remote_write:
- url: https://prom-push.example.com/api/v1/write
เปิดปลายทางรับข้อมูลนั้นผ่าน Caddy พร้อม basic auth แทนการเปิดพอร์ต 9090 ตรง ๆ
หมายเหตุตามจริง
Prometheus ทำงานแบบดึง (pull): ยอดเยี่ยมสำหรับกลุ่มเครื่องที่คุณควบคุม และไม่สะดวกสำหรับทุกอย่างที่อยู่หลัง NAT จึงต้องใช้เทคนิค agent พื้นที่จัดเก็บภายในของมันไม่ได้ออกแบบมาสำหรับประวัติหลายปี หากต้องเก็บนานคุณค่อยเพิ่มที่เก็บระยะไกลภายหลัง และแดชบอร์ดเป็นเพียงครึ่งหนึ่งของคุณค่า: ตั้งการแจ้งเตือนอย่างน้อยสามรายการตั้งแต่วันแรก (ดิสก์เกิน 85% หน่วยความจำตึงตัว เครื่องเป้าหมายล่ม) ไม่เช่นนั้นคุณจะดูกราฟก็ต่อเมื่อมีอะไรพังไปแล้ว
ที่เกี่ยวข้อง
- VPS สำหรับมอนิเตอร์ uptime (Uptime Kuma): แจ้งเตือนเมื่อระบบล่มและหน้าสถานะ
- วิธีตั้งค่าไฟร์วอลล์ UFW
- VPS ต้องใช้ RAM เท่าไร?
ความคิดเห็น
ยังไม่มีความคิดเห็น เป็นคนแรกสิ