网站监控与告警设置 是通过配置可用性监控、性能监控、错误追踪、日志分析,设置多级告警规则,确保网站问题及时发现、快速响应,最大限度减少停机时间和用户损失的系统化管理方法。
为什么需要监控?
监控价值
业务价值:
✅ 减少停机时间
✅ 快速发现问题
✅ 提升用户体验
✅ 数据驱动优化
成本对比:
监控成本:每月几百元
停机损失:每分钟数千到数万
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 年经验总结
- 多层次监控
- 可用性
- 性能
- 错误
-
资源
-
合理告警
- 分级告警
- 避免告警疲劳
-
升级机制
-
快速响应
- 值班制度
- 响应流程
-
问题追踪
-
持续优化
- 分析告警
- 优化阈值
-
减少误报
-
文档记录
- 监控配置
- 告警规则
- 响应流程
西安企业建议
- 选择国内监控服务
- 配置多级告警
- 建立响应机制
- 定期演练
常见问题解答
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:网站日志分析方法
标签: 网站建设
还木有评论哦,快来抢沙发吧~