当前位置: 首页 > news >正文

从‘它又挂了’到‘稳如老狗’:我是如何用Prometheus+Grafana给自家小破站做监控的

从“它又挂了”到“稳如老狗”:我是如何用Prometheus+Grafana给自家小破站做监控的

凌晨三点,手机突然响起钉钉告警——这已经是本周第三次被“502 Bad Gateway”的提示音吵醒。揉着惺忪睡眼重启Nginx时,我突然意识到:这个用业余时间维护的个人博客,正在消耗远超预期的精力。如果你也经历过服务器突然崩溃却找不到原因、或是流量小高峰时手忙脚乱调整配置的窘境,这套用Prometheus+Grafana搭建的轻量监控方案,或许能让你和我一样告别“救火队员”的角色。

1. 为什么个人项目更需要监控?

很多人认为监控是企业级应用的专利,直到某天发现:

  • 隐性故障:数据库连接池悄悄耗尽,用户看到的是“偶尔抽风”
  • 事后复盘:没有历史数据,故障排查变成“盲人摸象”
  • 资源黑洞:某个跑偏的脚本吃光内存,连带拖垮整个服务

我的博客运行在2核4G的云服务器上,使用率长期低于30%。直到某天收到云厂商的流量超额账单,才发现被爬虫持续扫描漏洞。正是这次教训让我明白:监控不是成本,而是性价比最高的运维投资

2. 监控方案选型:为什么是Prometheus+Grafana?

对比常见方案:

工具优点缺点适合场景
Zabbix功能全面资源占用高企业级环境
Nagios告警机制成熟配置复杂传统运维
CloudWatch开箱即用费用随数据量增长AWS深度用户
Prometheus轻量、时序数据专业处理需要自行搭建容器/微服务/个人项目

Prometheus的多维度数据模型Pull模式特别适合资源有限的场景。配合Grafana的可视化能力,不到1GB内存就能获得企业级80%的监控功能。

提示:如果你的服务器内存小于1G,可以考虑关闭Prometheus的TSDB压缩(storage.tsdb.retention.size参数)

3. 实战部署:从零搭建监控系统

3.1 安装Prometheus

用Docker快速启动(假设已安装Docker):

mkdir -p /opt/prometheus/config cat <<EOF > /opt/prometheus/config/prometheus.yml global: scrape_interval: 15s scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] EOF docker run -d --name=prometheus \ -p 9090:9090 \ -v /opt/prometheus/config:/etc/prometheus \ prom/prometheus

关键参数说明:

  • scrape_interval:抓取频率,个人站点建议15-30秒
  • targets:监控目标地址,后续会逐步添加

3.2 接入基础指标

3.2.1 监控服务器本身

安装node_exporter采集主机指标:

docker run -d --name=node_exporter \ -p 9100:9100 \ --net="host" \ --pid="host" \ -v "/:/host:ro,rslave" \ prom/node-exporter

然后在prometheus.yml中添加新job:

- job_name: 'node' static_configs: - targets: ['your_server_ip:9100']
3.2.2 监控Nginx

启用Nginx stub_status模块:

server { listen 8080; server_name localhost; location /metrics { stub_status on; access_log off; allow 127.0.0.1; deny all; } }

通过nginx-exporter转换指标格式:

docker run -d --name=nginx-exporter \ -p 9113:9113 \ nginx/nginx-prometheus-exporter \ -nginx.scrape-uri http://your_nginx_ip:8080/metrics

3.3 配置Grafana仪表盘

启动Grafana容器:

docker run -d --name=grafana \ -p 3000:3000 \ grafana/grafana

登录后:

  1. 添加Prometheus数据源(地址填http://prometheus:9090)
  2. 导入官方仪表盘:
    • 主机监控:ID 1860
    • Nginx监控:ID 12708

我的自定义看板重点关注:

  • 黄金指标:请求错误率、响应时间、流量
  • 资源水位线:CPU>80%或内存>90%持续5分钟告警
  • 业务指标:每日活跃用户、热门内容排行

4. 告警配置:从被动响应到主动预防

4.1 基础告警规则

在prometheus.yml同级目录创建alert.rules文件:

groups: - name: host rules: - alert: HighCPU expr: 100 - (avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80 for: 5m labels: severity: warning annotations: summary: "高CPU使用率 ({{ $value }}%)" description: "实例 {{ $labels.instance }} CPU持续高于80%" - alert: NginxDown expr: nginx_up == 0 for: 1m labels: severity: critical annotations: summary: "Nginx服务下线"

4.2 对接钉钉告警

使用Prometheus Alertmanager + 钉钉机器人:

  1. 配置alertmanager.yml:
route: receiver: 'dingding' receivers: - name: 'dingding' webhook_configs: - url: 'https://oapi.dingtalk.com/robot/send?access_token=your_token' send_resolved: true
  1. 启动Alertmanager容器:
docker run -d --name=alertmanager \ -p 9093:9093 \ -v /path/to/alertmanager.yml:/etc/alertmanager/alertmanager.yml \ prom/alertmanager

5. 避坑指南:那些年我踩过的雷

  1. 指标爆炸:初期采集了太多无用指标,导致Prometheus存储暴涨

    • 解决方案:用metric_relabel_configs过滤
    metric_relabel_configs: - source_labels: [__name__] regex: '(node_network_receive_bytes|node_cpu_seconds_total)' action: keep
  2. 告警疲劳:最初设置的阈值太敏感,半夜频繁被吵醒

    • 优化方案:区分warning/critical级别,非核心服务设置工作时间告警
  3. 资源竞争:监控系统自身消耗过高

    • 实测数据(2核4G服务器):
      • Prometheus:约300MB内存
      • node_exporter:15MB内存
      • Grafana:200MB内存

6. 进阶技巧:让监控产生业务价值

除了基础运维指标,我还逐步添加了:

  • 用户体验监控:通过Nginx日志分析慢请求

    # 统计P99响应时间 histogram_quantile(0.99, sum(rate(nginx_http_request_duration_seconds_bucket[5m])) by (le))
  • 成本关联:结合云API获取费用数据,建立“流量-资源-成本”关联分析

  • 自动化联动:当检测到爬虫特征时,自动触发WAF规则更新

现在我的早晨例行检查从SSH登录变成了打开手机看Grafana仪表盘。有次朋友问我:“你网站最近怎么这么稳定?”我笑着回答:“因为我知道它什么时候会出问题——在用户发现之前。”

http://www.jsqmd.com/news/563034/

相关文章:

  • Point Transformer实战:在S3DIS数据集上实现70.4% mIoU的语义分割(避坑指南)
  • 告别ReLU?用PyTorch和TensorFlow亲手实现Swish激活函数(附代码对比)
  • ATX电源选购避坑指南:从80Plus认证到模组化,这些参数你真的懂吗?
  • 2026IT培训品牌费用白皮书 认证培训实战应用解析 - 优质品牌商家
  • 【Linux实战】parted命令高效应用:从GPT分区到自动化管理的进阶技巧
  • 京东大模型算法工程师面经深度解析:薪资、面试题、项目经验全收录,助你拿下高薪Offer!
  • 从外卖骑手到网安从业者,从日跑百单到月入 1.5W,我的逆袭之路
  • 论文AI率高达90%如何稳过知网?2026最新实测:4大降重平台PK与人工重构指南(10%通关铁证)
  • 为什么计算机缓存要分 L1、L2、L3?
  • 原创C#运动控制树形图框架源码(Demo版No.3)|支持多工具异步执行与雷赛控制卡快速适配
  • 解锁Gemini开发者模式:提示词优化的终极密钥
  • ZGC类加载器泄漏导致ZRelocationSet饱和?一线大厂SRE团队封存3年的ZGC内存泄漏根因分析
  • 【矛与盾的博弈:ZLibrary反爬机制实战分析与绕过技术全解析】
  • TCP协议核心机制与实战调优指南
  • 决定UPS能撑多久的5大关键因素
  • 从智能家居到商场导航:手把手教你用uniapp开发WiFi环境感知App(附信号强度算法)
  • 避开这3个坑!Grafana通用OAuth配置最全指南(6.x/7.x版本实测)
  • 锂电池安全防护:DW01A与8205A组合方案的设计与优化
  • 2026年合同管理软件六大厂商技术架构全解析
  • Diablo Edit2:开源角色编辑工具的全方位应用指南
  • 基于WOA鲸鱼优化算法的圆柱体容器最大体积优化设计matlab仿真
  • Ryujinx技术解析:从核心原理到实战应用
  • X-NUCLEO-IKA01A1:STM32模拟前端硬件即API设计解析
  • 当颗粒流遇上非稳定渗流:一次隧道渗流的PFC7.觅食记
  • C# WinForm超市管理软件系统源码(SQL Server版)
  • Anthropic 祭出杀手锏:你可能错过了 Agent 架构的真正巨变
  • 2026年AI岗位暴涨12倍!高薪神仙工作,普通人也能拿高薪?这6大方向速码!
  • 告别复杂参数:MATLAB语法高亮的一键式美学设置指南
  • 【综合能源系统】两种电池损耗模型在综合能源系统中的应用实例研究(Matlab代码实现)
  • nginx介绍