真实有效的网站可用性监控
凌晨三点,真实站服务器返回502。有效用性用户打开页面看到的监控是白屏,而你还在睡觉。真实站这种事我遇到过三次,有效用性前两次都是监控用户截图发到群里才知道。第三次之后我写了监控脚本,真实站但真正管用的有效用性不是脚本本身,是监控搞清楚到底该监控什么。
很多人上来就ping域名。真实站ping通了就以为万事大吉,有效用性其实ping只告诉你服务器网卡还活着。监控HTTP服务挂了、真实站数据库连不上、有效用性SSL证书过期,监控ping照样通。我见过一个站点ping延迟稳定在20ms,打开首页转圈转了40秒——后端在查一张没加索引的千万级表。
所以第一步:监控HTTP状态码和响应时间。curl一行就能搞定,curl -o /dev/null -s -w "%{ http_code} %{ time_total}" https://example.com。200算正常,301/302要跟到底看最终落地页,4xx说明路径或权限有问题,5xx直接告警。响应时间超过3秒就得盯着,超过10秒基本等于不可用。别只看首页,把登录、搜索、支付这些关键路径单独列出来测。首页静态化做得再好,搜索接口挂了用户照样骂娘。
有个坑:CDN缓存会骗你。你监控的是CDN边缘节点的缓存副本,源站挂了它还能返回200。解决办法是加一个随机查询参数,比如?t=时间戳,强制回源。或者直接监控源站IP,在Host头里写域名。我吃过这个亏,CDN缓存了错误页面,监控显示一切正常,用户看到的却是“数据库连接失败”。
内容校验比状态码更实在。返回200不代表页面是对的。可能返回了一个“系统维护中”的200页面,或者登录后跳转到了错误页。写个脚本抓取页面里的关键元素,比如“退出登录”按钮、用户昵称、订单列表里至少一条记录。没有就告警。这比单纯看状态码靠谱得多,虽然写起来麻烦点,但误报和漏报都少。
频率怎么定?首页一分钟一次,关键接口三十秒一次,非核心页面五分钟一次。别搞太密,自己把自己DDoS了。监控节点至少两个,一个机房内一个机房外。机房内看服务本身,机房外看网络链路和DNS。DNS解析挂了,你机房内监控一切正常,外面用户根本找不到你。
告警渠道要分级。微信/钉钉机器人发普通告警,电话短信只留给P0级别。不然半夜三点一个非核心页面超时把你吵醒,第二天你就把告警静音了,然后真出事的时候啥也收不到。我现在的规则:连续三次失败才告警,单次失败只记录。告警里必须带上下文——哪个URL、什么错误、响应时间、最近一次成功是什么时候。只发“网站挂了”四个字的告警等于没发。
最后说个反直觉的:监控页面本身也会挂。你的监控脚本跑在一台服务器上,那台服务器宕机了,你就瞎了。用cron跑本地脚本的,加个心跳检测——脚本每跑一次就往一个外部服务发个信号,比如healthchecks.io。信号断了说明监控本身出问题了。别笑,我遇到过监控服务器磁盘满导致脚本写日志失败,整整两天没发出任何告警。
真实有效的监控不是装个Zabbix就完事。你得知道用户怎么用你的网站,然后在那些路径上设卡。状态码、响应时间、内容关键字、DNS、SSL到期时间,一个都不能少。但最重要的还是那句:监控是为了在用户骂你之前你先知道。如果用户比你先知道,那这套监控就是摆设。