10分钟搭建Linux服务器监控告警系统,手机实时接收预警
假期过完了哈,该上班了兄弟们,不知道你们有没有过服务器告警提醒,我之前总能收到腾讯云的恶意文件提醒,但是进入服务器查看相关目录又没有,应该是被删除了,郁闷的不是这个而是夜睡得正香,突然接到客户/老板来电说网站打不开了,爬起来一查,服务器早就挂了,CPU 飙到 100% 已经跑了俩小时。这种被动挨打的感觉,我懂,太懂了~~~所以今天,咱们尝试用几分钟搭一个监控告警系统,让服务器有任何风吹草动,你手机/邮箱立马就能收到通知。最重要的是不用花钱买服务,全程免费部署。
首先为啥要监控?
之前我总觉得自己的小博客不至于,不像大厂服务特别多必须实时监控。其实这么想你就错了,即便就一台小服务器,也得知道:
CPU 是不是快跑满了
内存够不够用
磁盘会不会爆
服务有没有挂
这些东西等你发现问题的时候,往往已经晚了。监控的意义不是事后诸葛亮,而是提前预警。让你可以掌控全局,而不是被控
确定方案选型
监控方案一堆,咱选个简单好用的:Prometheus + Grafana + Alertmanager。听着名字挺唬人,其实部署起来贼简单。Prometheus 负责采集数据,Grafana 负责展示图表,Alertmanager 负责发告警。三位一体,完美。当然如果是安装的宝塔面板那就更简单了,后台有相关设置,甚至不需要敲代码,设置了提醒方案,告诉服务器哪些需要提醒就完了。如图设置:

当然云服务器后台也有相关的配置,只是基本收费,免费的简直就是凤毛麟角。但是今天不用宝塔用代码。当然觉得代码繁琐就安装一个宝塔面本吧~~~
安装部署
创建目录
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

默认登录:admin/admin(首次登录 会让你改密码)
添加数据源:
点击左侧齿轮图标 → Data Sources
Add data source → Prometheus
URL 填
http://localhost:9090Save & Test
导入模板:
点击左侧加号 → Import
输入模板 ID
1860(Node Exporter 经典模板)选择 Prometheus 数据源
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,随便你折腾。只要你想就行,记住:好的运维不是救火队员,而是防火专家。
有问题留言反馈,我去继续折腾小程序代码了。



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