最近服务器老是莫名其妙挂机,半夜被老板电话叫醒重启的兄弟应该不少吧?今天分享个监控告警系统的搭建方法,让服务器有问题自动发邮件通知,再也不用24小时盯着了。先说效果:服务器CPU爆了、内存满了、进程挂了,15秒内自动发邮件到QQ邮箱,手机立马收到通知。
技术栈选择(都是开源免费的)
用的都是业内主流工具,踩坑的人多,资料也多:
- Prometheus:监控界的扛把子,数据采集和告警规则
- Node_Exporter:轻量级指标采集器,CPU、内存、硬盘使用率都能监控
- Alertmanager:告警管理中心,支持邮件、钉钉、微信通知
- cpolar:内网穿透工具,没公网IP也能远程访问
环境准备
测试环境:CentOS 7.x
- 1核2G配置就够了,我用的是阿里云最便宜的那种
- 需要安装node_exporter和prometheus(前置依赖)
- 有个QQ邮箱就行,用来接收告警
第一步:安装Alertmanager
下载安装包 去Prometheus官网下载:https://prometheus.io/download/ 选Linux版本,我下的是alertmanager-0.28.1.linux-amd64.tar.gz创建目录解压
mkdir -p /app/alertmanager
cd /app/alertmanager
# 上传下载好的文件,然后解压
tar -vxzf alertmanager-0.28.1.linux-amd64.tar.gz
mv alertmanager-0.28.1.linux-amd64 alertmanager
配置系统服务
cd /usr/lib/systemd/system
vim alertmanager.service
配置文件内容:
[Unit]
Description=https://prometheus.io
[Service]
Restart=on-failure
ExecStart=/app/alertmanager/alertmanager --config.file=/app/alertmanager/alertmanager.yml
[Install]
WantedBy=multi-user.target
启动服务
systemctl daemon-reload
systemctl start alertmanager.service
systemctl enable alertmanager.service
启动成功后访问http://你的IP:9093,看到界面就说明OK了。
第二步:配置内网穿透(重点)
很多兄弟的服务器在内网,没有公网IP,这时候cpolar就派上用场了。安装cpolar
sudo curl https://get.cpolar.sh | sh
sudo systemctl status cpolar
配置隧道 浏览器访问http://你的IP:9200,用cpolar账号登录。创建隧道:
- 隧道名称:alertmanager
- 协议:http
- 本地地址:9093
- 域名类型:随机域名
- 地区:China Top
创建完成后会生成一个公网地址,比如4246d47e.r2.cpolar.top,记住这个地址。
第三步:配置Prometheus对接Alertmanager
修改prometheus配置
vi /app/prometheus/prometheus.yml
在配置文件中添加alertmanager配置:
alerting:
alertmanagers:
- static_configs:
- targets: ["4246d47e.r2.cpolar.top"] # 用cpolar生成的地址
重启prometheus
systemctl restart prometheus
第四步:配置告警规则
创建告警规则文件
vi /app/prometheus/1.yml
配置内容:
groups:
- name: node-alerts
rules:
# node_exporter宕机告警
- alert: node_exporter实例宕机
expr: up{job="node_exporter",instance="localhost:9100"} == 0
for: 15s
labels:
severity: critical
annotations:
summary: "实例 {{ $labels.instance }} 已停止运行超过 15 秒!"
description: "作业 {{ $labels.job }} 的实例 {{ $labels.instance }} 无法抓取。"
- name: prometheus
rules:
# prometheus自身宕机告警
- alert: 实例宕机
expr: up{job="prometheus"} == 0
for: 15s
labels:
severity: critical
annotations:
summary: "实例 {{ $labels.instance }} 已停止运行超过 15 秒!"
description: "作业 {{ $labels.job }} 的实例 {{ $labels.instance }} 无法抓取。"
测试告警规则
systemctl restart prometheus
# 停止node_exporter测试告警
systemctl stop node_exporter
15秒后在prometheus和alertmanager界面都能看到告警了。
第五步:配置QQ邮箱通知(关键步骤)
获取QQ邮箱授权码
- 登录QQ邮箱,设置 -> 账户
- 开启SMTP服务
- 获取授权码(不是QQ密码!)
配置Alertmanager邮件发送
vi /app/alertmanager/alertmanager/alertmanager.yml
配置内容:
global:
resolve_timeout: 5m
smtp_from: '你的QQ邮箱'
smtp_smarthost: 'smtp.qq.com:465'
smtp_auth_username: '你的QQ邮箱'
smtp_auth_password: '你的QQ邮箱授权码' # 注意是授权码不是密码
smtp_require_tls: false
smtp_hello: 'qq.com'
route:
group_by: ['alertname']
group_wait: 5s
group_interval: 5s
repeat_interval: 5m
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: '你的QQ邮箱'
send_resolved: true
重启服务测试
systemctl restart alertmanager
# 再次停止node_exporter测试
systemctl stop node_exporter
等几分钟,QQ邮箱就会收到告警邮件了!
第六步:固定公网地址(可选)
cpolar的随机地址会变,想要固定地址需要保留二级子域名:
- cpolar控制台 -> 预留 -> 保留二级子域名
- 地区选China Top,设置子域名(如alertmanager)
- 隧道管理 -> 编辑隧道 -> 域名类型选择二级子域名
- 填入保留的子域名,更新即可
这样就有了固定的公网访问地址了。
踩坑经验分享
常见问题:
- QQ邮箱发不出邮件:检查是否用的授权码而不是QQ密码
- prometheus抓取不到数据:检查防火墙,确保端口能访问
- 告警不触发:检查告警规则语法,用prometheus界面测试表达式
- 内网穿透不稳定:免费版cpolar有连接数限制,付费版更稳定
优化建议:
- 可以添加CPU、内存使用率告警规则
- 支持钉钉、企业微信通知,比邮件更及时
- 建议配置数据持久化存储
扩展配置
CPU使用率告警
- alert: CPU使用率过高
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > 80
for: 2m
labels:
severity: warning
annotations:
summary: "{{ $labels.instance }} CPU使用率过高"
description: "CPU使用率已超过80%,当前值:{{ $value }}%"
内存使用率告警
- alert: 内存使用率过高
expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 80
for: 2m
labels:
severity: warning
annotations:
summary: "{{ $labels.instance }} 内存使用率过高"
description: "内存使用率已超过80%,当前值:{{ $value }}%"
总结
这套监控系统搭建完成后,基本告别了半夜被叫醒处理故障的痛苦。关键是配置简单,成本低,适合个人和小团队使用。整个系统的优势:
- 全开源免费,无成本压力
- 部署简单,半小时搞定
- 监控全面,CPU、内存、磁盘、进程都能监控
- 告警及时,15秒内发现问题
- 支持内网穿透,没公网IP也能用
你们现在用什么监控系统?有没有更好的开源方案推荐?欢迎回帖交流经验!
原创文章,作者:余初云,如若转载,请注明出处:https://blog.jidcy.com/yzj/94.html
