WEB-27:网站监控与告警设置

王尘宇 网站建设 3

网站监控与告警设置 是通过配置可用性监控、性能监控、错误追踪、日志分析,设置多级告警规则,确保网站问题及时发现、快速响应,最大限度减少停机时间和用户损失的系统化管理方法。


为什么需要监控?

监控价值

业务价值:

✅ 减少停机时间
✅ 快速发现问题
✅ 提升用户体验
✅ 数据驱动优化

成本对比:

监控成本:每月几百元
停机损失:每分钟数千到数万
ROI:非常明显

监控场景

可用性监控:

- 网站是否可访问
- 响应时间是否正常
- SSL 证书状态
- 域名到期提醒

性能监控:

- 页面加载时间
- API 响应时间
- 数据库性能
- 服务器资源

错误监控:

- 应用错误
- JavaScript 错误
- API 错误
- 数据库错误

可用性监控

监控工具选择 ⭐⭐⭐⭐⭐

国际工具:

1. Uptime Robot
   - 免费 50 个监控
   - 5 分钟检查
   - 邮件/短信告警
   - 推荐 ⭐⭐⭐⭐⭐

2. Pingdom
   - 功能强大
   - 详细报告
   - $10/月起

3. StatusCake
   - 免费 10 个监控
   - 功能全面
   - 性价比高

国内工具:

1. 阿里云监控
   - 免费额度
   - 国内节点
   - 与阿里云集成

2. 腾讯云监控
   - 免费额度
   - 国内节点
   - 微信告警

3. 监控宝
   - 专业监控
   - 国内节点
   - 付费

配置监控 ⭐⭐⭐⭐⭐

Uptime Robot 配置:

1. 注册账号
   - 访问 uptimerobot.com
   - 免费注册

2. 添加监控
   - Monitor Type: HTTP(s)
   - Friendly Name: 网站名称
   - URL: https://yourdomain.com
   - Monitoring Interval: 5 minutes

3. 设置告警
   - Add Alert Contact
   - 邮箱/短信/微信
   - 告警阈值

4. 确认配置
   - 保存
   - 开始监控

多地点监控:

监控节点:
- 北京
- 上海
- 广州
- 美国
- 欧洲

优势:
- 发现区域性问题
- CDN 效果监控
- 全球可用性

监控指标 ⭐⭐⭐⭐⭐

核心指标:

1. 可用性
   - 目标:99.9%+
   - 计算:正常运行时间/总时间

2. 响应时间
   - 目标:<3 秒
   - 警告:>5 秒
   - 严重:>10 秒

3. SSL 状态
   - 证书有效
   - 到期提醒(30 天)
   - 加密强度

告警级别:

P0 - 网站不可用:立即电话
P1 - 响应慢:5 分钟内通知
P2 - SSL 即将到期:邮件通知
P3 - 性能下降:每日报告

性能监控

页面性能 ⭐⭐⭐⭐⭐

Google PageSpeed:

// PageSpeed Insights API
const PSI_KEY = 'YOUR_API_KEY';

async function checkPageSpeed(url) {
  const response = await fetch(
    `https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=${url}&key=${PSI_KEY}`
  );
  const data = await response.json();

  return {
    performance: data.lighthouseResult.categories.performance.score,
    fcp: data.lighthouseResult.audits['first-contentful-paint'].numericValue,
    lcp: data.lighthouseResult.audits['largest-contentful-paint'].numericValue,
    cls: data.lighthouseResult.audits['cumulative-layout-shift'].numericValue
  };
}

性能指标:

Core Web Vitals:
- LCP (最大内容绘制): <2.5 秒
- FID (首次输入延迟): <100 毫秒
- CLS (累积布局偏移): <0.1

其他指标:
- FCP (首次内容绘制): <1.5 秒
- TTI (可交互时间): <3.5 秒
- TBT (总阻塞时间): <200 毫秒

API 性能监控 ⭐⭐⭐⭐

监控实现:

const axios = require('axios');

async function monitorAPI(endpoint) {
  const start = Date.now();

  try {
    const response = await axios.get(endpoint, {
      timeout: 5000
    });

    const responseTime = Date.now() - start;

    return {
      status: 'success',
      statusCode: response.status,
      responseTime: responseTime,
      timestamp: new Date().toISOString()
    };
  } catch (error) {
    return {
      status: 'error',
      error: error.message,
      responseTime: Date.now() - start,
      timestamp: new Date().toISOString()
    };
  }
}

// 定期监控
setInterval(async () => {
  const result = await monitorAPI('https://api.example.com/health');
  console.log(result);

  // 发送告警
  if (result.status === 'error' || result.responseTime > 1000) {
    sendAlert(result);
  }
}, 60000); // 每分钟

错误监控

应用错误 ⭐⭐⭐⭐⭐

Sentry 集成:

// 安装
npm install @sentry/node

// 配置
const Sentry = require('@sentry/node');

Sentry.init({
  dsn: 'YOUR_SENTRY_DSN',
  environment: 'production',
  tracesSampleRate: 1.0,
});

// 捕获错误
try {
  // 可能出错的代码
} catch (error) {
  Sentry.captureException(error);
}

// 自定义上下文
Sentry.configureScope(scope => {
  scope.setUser({ id: user.id, email: user.email });
  scope.setTag('page', 'checkout');
});

前端错误监控:

// 全局错误处理
window.onerror = function(message, source, lineno, colno, error) {
  Sentry.captureException(error, {
    extra: {
      message: message,
      source: source,
      lineno: lineno,
      colno: colno
    }
  });
};

// Promise 错误
window.onunhandledrejection = function(event) {
  Sentry.captureException(event.reason);
};

日志监控 ⭐⭐⭐⭐

日志收集:

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

// 使用
logger.info('用户登录', { userId: 123, ip: '192.168.1.1' });
logger.error('数据库连接失败', { error: err.message });

日志分析:

关键错误:
- 数据库错误
- 认证失败
- 支付失败
- API 超时

告警规则:
- 错误率 > 1%:警告
- 错误率 > 5%:严重
- 特定错误:立即告警

服务器监控

资源监控 ⭐⭐⭐⭐⭐

监控指标:

CPU:
- 使用率:<70%
- 警告:>80%
- 严重:>90%

内存:
- 使用率:<80%
- 警告:>85%
- 严重:>95%

磁盘:
- 使用率:<80%
- 警告:>85%
- 严重:>90%

网络:
- 带宽使用
- 连接数
- 错误率

监控脚本:

#!/bin/bash

# CPU 使用率
CPU=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)

# 内存使用率
MEMORY=$(free | grep Mem | awk '{printf("%.2f"), $3/$2 * 100.0}')

# 磁盘使用率
DISK=$(df -h / | tail -1 | awk '{print $5}' | cut -d'%' -f1)

# 检查并告警
if (( $(echo "$CPU > 80" | bc -l) )); then
  echo "CPU 使用率过高:$CPU%" | mail -s "服务器告警" admin@example.com
fi

if (( $(echo "$MEMORY > 85" | bc -l) )); then
  echo "内存使用率过高:$MEMORY%" | mail -s "服务器告警" admin@example.com
fi

if [ $DISK -gt 85 ]; then
  echo "磁盘使用率过高:$DISK%" | mail -s "服务器告警" admin@example.com
fi

进程监控 ⭐⭐⭐⭐

进程监控:

#!/bin/bash

# 检查 Nginx
if ! pgrep -x "nginx" > /dev/null; then
  echo "Nginx 进程已停止" | mail -s "服务告警" admin@example.com
  systemctl start nginx
fi

# 检查 MySQL
if ! pgrep -x "mysqld" > /dev/null; then
  echo "MySQL 进程已停止" | mail -s "服务告警" admin@example.com
  systemctl start mysql
fi

# 检查 PHP-FPM
if ! pgrep -x "php-fpm" > /dev/null; then
  echo "PHP-FPM 进程已停止" | mail -s "服务告警" admin@example.com
  systemctl start php-fpm
fi

告警设置

告警渠道 ⭐⭐⭐⭐⭐

邮件告警:

const nodemailer = require('nodemailer');

async function sendEmailAlert(subject, message) {
  const transporter = nodemailer.createTransport({
    host: process.env.SMTP_HOST,
    auth: {
      user: process.env.SMTP_USER,
      pass: process.env.SMTP_PASS
    }
  });

  await transporter.sendMail({
    from: '监控 ',
    to: 'admin@example.com',
    subject: `[告警] ${subject}`,
    text: message
  });
}

短信告警:

// 阿里云短信
async function sendSMSAlert(phone, message) {
  // 使用阿里云短信 API
  const result = await client.sendSms({
    PhoneNumbers: phone,
    SignName: '网站监控',
    TemplateCode: 'SMS_123456789',
    TemplateParam: JSON.stringify({ message: message })
  });

  return result;
}

即时通讯告警:

// 企业微信
async function sendWechatAlert(message) {
  const webhook = 'YOUR_WEBHOOK_URL';

  await axios.post(webhook, {
    msgtype: 'text',
    text: {
      content: `【网站告警】\n${message}`
    }
  });
}

// 钉钉
async function sendDingtalkAlert(message) {
  const webhook = 'YOUR_WEBHOOK_URL';

  await axios.post(webhook, {
    msgtype: 'text',
    text: {
      content: `【网站告警】\n${message}`
    }
  });
}

告警规则 ⭐⭐⭐⭐⭐

分级告警:

P0 - 严重(网站不可用):
- 渠道:电话 + 短信 + 即时通讯
- 响应:5 分钟内
- 升级:15 分钟未响应升级

P1 - 警告(性能下降):
- 渠道:短信 + 即时通讯
- 响应:30 分钟内
- 升级:1 小时未响应升级

P2 - 注意(潜在问题):
- 渠道:即时通讯
- 响应:4 小时内
- 升级:次日未处理升级

P3 - 信息(日常报告):
- 渠道:邮件
- 响应:每日查看

告警升级:

const escalationLevels = [
  { delay: 0, contacts: ['oncall@example.com'] },
  { delay: 15, contacts: ['team-lead@example.com'] },
  { delay: 30, contacts: ['manager@example.com'] },
  { delay: 60, contacts: ['cto@example.com'] }
];

async function sendEscalatingAlert(issue) {
  for (const level of escalationLevels) {
    setTimeout(() => {
      if (!issue.resolved) {
        sendAlert(level.contacts, issue);
      }
    }, level.delay * 60000);
  }
}

监控仪表板

数据展示 ⭐⭐⭐⭐

Grafana 配置:

数据源:
- Prometheus
- MySQL
- Elasticsearch

仪表板:
- 可用性概览
- 性能指标
- 错误统计
- 资源使用

关键指标展示:

1. 可用性
   - 当前状态
   - 7 天可用性
   - 30 天可用性

2. 性能
   - 平均响应时间
   - P95 响应时间
   - P99 响应时间

3. 错误
   - 今日错误数
   - 错误率
   - 错误趋势

4. 资源
   - CPU 使用率
   - 内存使用率
   - 磁盘使用率

王尘宇实战建议

18 年经验总结

  1. 多层次监控
  2. 可用性
  3. 性能
  4. 错误
  5. 资源

  6. 合理告警

  7. 分级告警
  8. 避免告警疲劳
  9. 升级机制

  10. 快速响应

  11. 值班制度
  12. 响应流程
  13. 问题追踪

  14. 持续优化

  15. 分析告警
  16. 优化阈值
  17. 减少误报

  18. 文档记录

  19. 监控配置
  20. 告警规则
  21. 响应流程

西安企业建议

  • 选择国内监控服务
  • 配置多级告警
  • 建立响应机制
  • 定期演练

常见问题解答

Q1:监控间隔多久合适?

答:
- 可用性:1-5 分钟
- 性能:5-15 分钟
- 资源:1-5 分钟
- 日志:实时

Q2:如何避免告警疲劳?

答:
- 合理阈值
- 分级告警
- 告警聚合
- 静默时间

Q3:需要监控哪些指标?

答:
- 可用性(必须)
- 响应时间(必须)
- 错误率(必须)
- 资源使用(推荐)

Q4:告警发给谁?

答:
- 值班人员
- 技术负责人
- 升级机制
- 轮班制度

Q5:监控成本多少?

答:
- 免费工具:0 元
- 基础付费:100-500 元/月
- 企业级:1000 元+/月
- 根据需求


总结

网站监控与告警设置核心要点:

  • 📊 可用性监控 — 多地点、多工具
  • 性能监控 — 页面、API、资源
  • 🐛 错误监控 — 应用、前端、日志
  • 📱 告警设置 — 多渠道、分级、升级
  • 📈 仪表板 — 数据展示、可视化

王尘宇建议: 监控是网站健康的眼睛。建立完善的监控体系,及时发现问题,快速响应处理。


关于作者

王尘宇
西安蓝蜻蜓网络科技有限公司创始人

联系方式:
- 🌐 网站:wangchenyu.com
- 💬 微信:wangshifucn
- 📱 QQ:314111741
- 📍 地址:陕西西安


本文最后更新:2026 年 3 月 18 日
版权声明:本文为王尘宇原创,属于"网站建设系列"第 27 篇,转载请联系作者并注明出处。
下一篇:WEB-28:网站日志分析方法

标签: 网站建设

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~