10分钟搭建Linux服务器监控告警系统,手机实时接收预警

李洋博客今天16阅读0评论

假期过完了哈,该上班了兄弟们,不知道你们有没有过服务器告警提醒,我之前总能收到腾讯云的恶意文件提醒,但是进入服务器查看相关目录又没有,应该是被删除了,郁闷的不是这个而是夜睡得正香,突然接到客户/老板来电说网站打不开了,爬起来一查,服务器早就挂了,CPU 飙到 100% 已经跑了俩小时。这种被动挨打的感觉,我懂,太懂了~~~所以今天,咱们尝试用几分钟搭一个监控告警系统,让服务器有任何风吹草动,你手机/邮箱立马就能收到通知。最重要的是不用花钱买服务,全程免费部署。

首先为啥要监控?

之前我总觉得自己的小博客不至于,不像大厂服务特别多必须实时监控。其实这么想你就错了,即便就一台小服务器,也得知道:

  • CPU 是不是快跑满了

  • 内存够不够用

  • 磁盘会不会爆

  • 服务有没有挂

这些东西等你发现问题的时候,往往已经晚了。监控的意义不是事后诸葛亮,而是提前预警。让你可以掌控全局,而不是被控

确定方案选型

监控方案一堆,咱选个简单好用的:Prometheus + Grafana + Alertmanager。听着名字挺唬人,其实部署起来贼简单。Prometheus 负责采集数据,Grafana 负责展示图表,Alertmanager 负责发告警。三位一体,完美。当然如果是安装的宝塔面板那就更简单了,后台有相关设置,甚至不需要敲代码,设置了提醒方案,告诉服务器哪些需要提醒就完了。如图设置:

10分钟搭建Linux服务器监控告警系统,手机实时接收预警 第1张

当然云服务器后台也有相关的配置,只是基本收费,免费的简直就是凤毛麟角。但是今天不用宝塔用代码。当然觉得代码繁琐就安装一个宝塔面本吧~~~

安装部署

创建目录

mkdir -p /opt/monitoring/{prometheus,grafana,alertmanager}
cd /opt/monitoring

下载 Prometheus

wget https://github.com/prometheus/prometheus/releases/download/v2.52.0/prometheus-2.52.0.linux-amd64.tar.gz
tar -xzf prometheus-2.52.0.linux-amd64.tar.gz
mv prometheus-2.52.0.linux-amd64/* prometheus/
rm -rf prometheus-2.52.0.linux-amd64 prometheus-2.52.0.linux-amd64.tar.gz

配置 Prometheus

继续编辑配置文件 prometheus/prometheus.yml

global:
  scrape_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - localhost:9093

rule_files:
  - "alerts.yml"

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']

创建告警规则

新建配置规则, prometheus/alerts.yml

groups:
  - name: server_alerts
    rules:
      - alert: HighCPUUsage
        expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU 使用率过高"
          description: "{{ $labels.instance }} CPU 使用率超过 80%,当前值 {{ $value }}%"

      - alert: HighMemoryUsage
        expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "内存使用率过高"
          description: "{{ $labels.instance }} 内存使用率超过 85%,当前值 {{ $value }}%"

      - alert: DiskSpaceLow
        expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 15
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "磁盘空间不足"
          description: "{{ $labels.instance }} 根分区可用空间低于 15%,当前值 {{ $value }}%"

      - alert: ServiceDown
        expr: up == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "服务宕机"
          description: "{{ $labels.instance }} 服务已宕机超过 1 分钟"

下载 Node Exporter

这玩意儿负责采集系统指标:

wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar -xzf node_exporter-1.7.0.linux-amd64.tar.gz
mv node_exporter-1.7.0.linux-amd64/node_exporter prometheus/
rm -rf node_exporter-1.7.0.linux-amd64 node_exporter-1.7.0.linux-amd64.tar.gz

下载 Grafana

wget https://dl.grafana.com/oss/release/grafana-10.4.2.linux-amd64.tar.gz
tar -xzf grafana-10.4.2.linux-amd64.tar.gz
mv grafana-10.4.2/* grafana/
rm -rf grafana-10.4.2 grafana-10.4.2.linux-amd64.tar.gz

下载 Alertmanager

wget https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-amd64.tar.gz
tar -xzf alertmanager-0.27.0.linux-amd64.tar.gz
mv alertmanager-0.27.0.linux-amd64/* alertmanager/
rm -rf alertmanager-0.27.0.linux-amd64 alertmanager-0.27.0.linux-amd64.tar.gz

配置 Alertmanager 推送 QQ

编辑 alertmanager/alertmanager.yml

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'qq-webhook'

receivers:
  - name: 'qq-webhook'
    webhook_configs:
      - url: 'http://127.0.0.1:8080/alert'
        send_resolved: true

启动服务

创建启动脚本 start-monitor.sh:.

#!/bin/bash

# 启动 Node Exporter
cd /opt/monitoring/prometheus
nohup ./node_exporter > /var/log/node_exporter.log 2>&1 &

# 启动 Prometheus
nohup ./prometheus --config.file=prometheus.yml --storage.tsdb.path=data > /var/log/prometheus.log 2>&1 &

# 启动 Alertmanager
cd /opt/monitoring/alertmanager
nohup ./alertmanager --config.file=alertmanager.yml --storage.path=data > /var/log/alertmanager.log 2>&1 &

# 启动 Grafana
cd /opt/monitoring/grafana
nohup ./bin/grafana-server --homepath=. > /var/log/grafana.log 2>&1 &

echo "监控服务已全部启动完成!"
echo "Prometheus: http://$(hostname -I | awk '{print $1}'):9090"
echo "Grafana: http://$(hostname -I | awk '{print $1}'):3000"
echo "默认账号密码:admin/admin"

赋予执行权限并运行:

chmod +x start-monitor.sh
./start-monitor.sh

配置 QQ 推送

这个我是不会写的,所以在网上查了相关的转发脚本代码,这是 webhook 转发的脚本代码,它把告警相关内容推送到指定 QQ:

cat > /opt/monitoring/qq-push.py << 'EOF'
#!/usr/bin/env python3
from flask import Flask, request
import requests
import json

app = Flask(__name__)

QQ_WEBHOOK_URL = "你的 QQ 机器人 Webhook 地址"

@app.route('/alert', methods=['POST'])
def alert():
    data = request.json
    alerts = data.get('alerts', [])
    
    for alert in alerts:
        status = alert.get('status', 'unknown')
        name = alert.get('labels', {}).get('alertname', 'Unknown')
        desc = alert.get('annotations', {}).get('description', '无描述')
        
        if status == 'firing':
            msg = f"🚨【告警】{name}\n{desc}"
        else:
            msg = f"✅【恢复】{name}\n服务已恢复正常"
        
        # 调用 QQ 机器人 API
        requests.post(QQ_WEBHOOK_URL, json={"msg": msg})
    
    return 'OK', 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)
EOF

安装依赖并启动:

pip3 install flask requests
nohup python3 /opt/monitoring/qq-push.py > /var/log/qq-push.log 2>&1 &

验证告警

全部完成后,我们尝试手动测试一下:

# 模拟 CPU 告警(开几个进程)
yes > /dev/null &
yes > /dev/null &
yes > /dev/null &

# 稍等一会儿,你应该会收到 QQ 推送消息。

# 清理测试进程
pkill yes

访问 Dashboard

浏览器打开 Grafana:http://你的服务器 IP:3000

10分钟搭建Linux服务器监控告警系统,手机实时接收预警 第2张

默认登录:admin/admin(首次登录    会让你改密码)

添加数据源:

  1. 点击左侧齿轮图标 → Data Sources

  2. Add data source → Prometheus

  3. URL 填 http://localhost:9090

  4. Save & Test

导入模板:

  1. 点击左侧加号 → Import

  2. 输入模板 ID 1860(Node Exporter 经典模板)

  3. 选择 Prometheus 数据源

  4. Import

搞定!你现在能看到服务器的实时图表了。

设置开机自启

cat > /etc/systemd/system/monitoring.service << 'EOF'
[Unit]
Description=Monitoring Stack
After=network.target

[Service]
Type=forking
ExecStart=/opt/monitoring/start-monitor.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable monitoring

大功告成

监控这玩意儿,早搭早享受。别等服务挂了才后悔。今天这套方案,零成本、开源、可扩展。你要是觉得 QQ 推送不够用,还可以改成微信、钉钉、邮件、Telegram,随便你折腾。只要你想就行,记住:好的运维不是救火队员,而是防火专家。
有问题留言反馈,我去继续折腾小程序代码了。

文章版权声明:除非注明,否则均为李洋博客原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
评论列表 (暂无评论,16人围观)

还没有评论,来说两句吧...

取消
微信二维码
微信二维码
支付宝二维码