1. 项目概述在企业IT运维工作中网站可用性监控是保障业务连续性的基础环节。传统的人工巡检方式效率低下而市面上的SaaS监控服务又往往存在价格昂贵、数据隐私等问题。本文将分享一套基于开源工具Prometheus的网站监控方案实现从探测到告警的全自动化流程特别适合中小型技术团队使用。这套方案的核心价值在于完全自主可控所有组件均可部署在内网环境支持同时监控数百个网站/API接口告警信息直接推送到企业微信群确保及时响应提供从部署到维护的完整工具链2. 架构设计解析2.1 技术选型理由选择Prometheus生态链主要基于以下考量Blackbox Exporter专为黑盒监控设计的探针支持HTTP/HTTPS/TCP等多种协议内置丰富的指标采集能力。相比自写爬虫脚本它具有以下优势内置重试机制和超时控制自动记录SSL证书信息提供响应时间直方图数据Alertmanager作为告警中枢支持多级告警路由区分严重/普通事件告警聚合与抑制多种通知渠道集成企业微信机器人选择企业微信而非其他IM工具的原因是国内访问稳定可靠支持Markdown格式消息可特定成员或全体人员2.2 数据流向说明整个监控流程的数据流转如下图所示[网站集群] │ ↓ (HTTP探测) [Blackbox Exporter] → 生成指标(probe_success, probe_duration等) │ ↓ (抓取) [Prometheus] → 评估告警规则 │ ↓ (推送告警) [Alertmanager] → 渲染消息模板 │ ↓ (Webhook) [企业微信机器人]3. 环境部署详解3.1 目录结构规划建议采用以下目录规范便于后期维护website-monitoring/ ├── bin/ # 二进制文件 ├── config/ # 配置文件 │ ├── alert_rules.yml │ ├── alertmanager.yml │ ├── blackbox.yml │ └── prometheus.yml ├── data/ # 数据存储 ├── logs/ # 日志文件 ├── templates/ # 消息模板 └── scripts/ # 维护脚本3.2 组件安装指南获取最新稳定版组件的推荐方法# 使用GitHub API获取最新版本号 get_latest_release() { curl -s https://api.github.com/repos/$1/releases/latest | grep tag_name: | sed -E s/.*([^]).*/\1/ } BLACKBOX_VER$(get_latest_release prometheus/blackbox_exporter) PROM_VER$(get_latest_release prometheus/prometheus) ALERT_VER$(get_latest_release prometheus/alertmanager) # 下载并解压到bin目录 wget -qO- https://github.com/prometheus/blackbox_exporter/releases/download/${BLACKBOX_VER}/blackbox_exporter-${BLACKBOX_VER:1}.linux-amd64.tar.gz | tar xz -C bin --strip-components1 --wildcards */blackbox_exporter注意生产环境建议固定版本号而非使用latest避免自动升级导致兼容性问题4. 配置深度解析4.1 Blackbox高级配置在blackbox.yml中我们可以针对不同网站类型设置差异化探测参数modules: ecommerce_healthcheck: prober: http timeout: 15s http: method: POST headers: Content-Type: application/json body: {action: healthcheck} fail_if_body_not_matches_regexp: - status:ok tls_config: insecure_skip_verify: false server_name: shop.example.com api_endpoint: prober: http http: valid_status_codes: [200, 401] # 允许未授权状态 fail_if_ssl: false # 允许HTTP协议关键参数说明fail_if_body_not_matches_regexp验证响应内容server_name指定TLS SNIfail_if_ssl强制HTTPS检查4.2 Prometheus告警规则优化精细化告警规则示例- alert: APISLAViolation expr: | ( avg_over_time(probe_duration_seconds{jobwebsite_availability}[5m]) 1.5 and rate(probe_failed_due_to_regex{jobwebsite_availability}[5m]) 0 ) or ( probe_http_status_code{jobwebsite_availability} 500 and probe_success 1 ) for: 5m labels: severity: warning annotations: impact: API响应时间超过SLA阈值或出现5xx错误这个规则实现了5分钟内平均响应时间1.5秒且无正则匹配失败或服务器返回5xx状态码但探测本身成功5. 企业微信集成实战5.1 机器人创建步骤在企业微信PC端右键点击目标群 → 选择「添加群机器人」设置机器人名称如「网站监控助手」记录生成的Webhook URL建议创建两个机器人常规告警用于性能劣化等普通事件关键告警配置all通知仅用于完全不可用场景5.2 消息模板进阶技巧改进后的消息模板wechat.tmpl{{ define wechat.message }} {{ range .Alerts }} {{ if eq .Status firing }} [{{ .Labels.severity | upper }}] {{ .Annotations.summary }} {{ .StartsAt.Format 15:04:05 }} 触发 {{ if eq .Labels.severity critical }}all{{ end }} {{ if .Annotations.description }} {{ .Annotations.description }}{{ end }} {{ if .Annotations.runbook }} 应急手册: {{ .Annotations.runbook }}{{ end }} ━━━━━━━━━━━━ {{ else }} ✅ [恢复] {{ .Annotations.summary }} ⏱ 故障时长: {{ humanizeDuration .Duration }} {{ .EndsAt.Format 15:04:05 }} 恢复 ━━━━━━━━━━━━ {{ end }} {{ end }} {{ end }}特色功能根据严重程度自动相关人员支持关联应急手册链接精简显示格式提高移动端可读性6. 运维管理脚本集6.1 网站批量管理工具扩展add-website.sh支持CSV文件批量导入#!/bin/bash # 单网站添加模式 if [ $# -eq 1 ]; then URL$1 # ...原有逻辑... elif [ -f $1 ]; then # CSV批量导入模式 CSV_FILE$1 TOTAL0 SUCCESS0 while IFS, read -r url module; do if grep -q $url $CONFIG; then echo 跳过已存在: $url continue fi # 在对应job下添加target sed -i /job_name: $module/,/- targets:/s/- targets:.*/\n - $url/ $CONFIG ((SUCCESS)) ((TOTAL)) done (tail -n 2 $CSV_FILE) # 跳过CSV头行 echo 批量导入完成: $SUCCESS/$TOTAL curl -X POST http://localhost:9090/-/reload fiCSV格式示例url,module https://api1.example.com,website_availability https://shop.example.com,ecommerce_healthcheck7. 性能调优指南7.1 大规模部署建议当监控目标超过100个时建议分片部署Blackbox# prometheus.yml - job_name: blackbox_asia static_configs: - targets: [blackbox-asia:9115] - job_name: blackbox_eu static_configs: - targets: [blackbox-eu:9115]调整Prometheus参数# 启动参数 --storage.tsdb.retention.time7d \ --query.max-concurrency20 \ --web.max-connections50优化抓取配置scrape_configs: - job_name: high_freq scrape_interval: 15s scrape_timeout: 10s static_configs: [...] - job_name: low_freq scrape_interval: 60s static_configs: [...]8. 故障排查手册8.1 常见问题诊断表现象检查步骤解决方案所有网站显示不可达1. 检查Blackbox日志2. 测试curl localhost:9115/metrics3. 验证网络连通性1. 重启Blackbox2. 检查防火墙规则3. 验证DNS配置告警重复发送1. 检查Alertmanager日志2. 验证group_interval设置3. 查看告警历史1. 调整repeat_interval2. 配置抑制规则企业微信消息格式错乱1. 检查模板语法2. 测试简单消息3. 验证Markdown格式1. 转义特殊字符2. 简化模板内容8.2 日志分析技巧通过PromQL快速定位问题# 查找响应最慢的10个网站 topk(10, avg_over_time(probe_duration_seconds[1h]) ) # 统计各状态码出现次数 count by (probe_http_status_code) ( probe_http_status_code{jobwebsite_availability} ) # 检测证书过期情况 (probe_ssl_earliest_cert_expiry - time()) / 86400 309. 方案扩展方向9.1 与Grafana集成推荐仪表盘配置全局状态看板各区域可用率地图响应时间热力图最近告警事件流单站详情页可用性趋势图状态码分布饼图证书有效期倒计时9.2 多维度监控增强前端性能指标modules: web_perf: prober: http http: preferred_ip_protocol: ip4 fail_if_body_not_matches_regexp: - window.performance.timing.loadEventEndAPI功能测试modules: payment_api: prober: http http: method: POST headers: Authorization: Bearer ${API_KEY} body: {amount: 1, currency: CNY} valid_status_codes: [200] fail_if_not_matches_regexp: - status:success这套监控方案经过多个生产环境验证在日均百万级探测请求下仍能稳定运行。关键在于根据实际业务需求灵活调整配置并建立完善的告警分级机制。对于需要更高可用性的场景可以考虑部署Prometheus高可用集群和Alertmanager集群模式。