如何用脚本监控网站状态

wen 实用脚本 2

网站宕机无人知?三步打造你的专属脚本监控系统(附零基础代码)**

如何用脚本监控网站状态

目录导读

  1. 为什么你需要一个“网站状态哨兵”?——从一次凌晨事故说起
  2. 核心原理拆解:脚本监控到底在“盯”什么?
  3. 手把手实战:从零编写可用的监控脚本(HTTP状态码 + 响应时间)
  4. 进阶警报机制:当网站挂了,如何第一时间通知你?(邮件/微信/钉钉)
  5. 高频问答:关于监控频率、误报处理、分布式监控的深度解答
  6. 监控脚本的最佳实践与避坑指南

为什么你需要一个“网站状态哨兵”?——从一次凌晨3点的事故说起

想象一下:你的电商网站正在举办大促,凌晨3点流量洪峰来袭,服务器不堪重负直接宕机,客户在刷新页面时看到的是“无法连接”,而你在熟睡中毫不知情,直到早上9点,你打开电脑才发现损失惨重——订单流失、品牌信任度下降。

这并非危言耸听,根据行业统计,网站每宕机1分钟,平均损失高达数千元(对于中大型站点而言),而人工巡检无法做到7×24小时覆盖,这时候,一个用脚本写成的“网站状态哨兵”就显得至关重要,它像一名永不疲倦的保安,每秒钟都在用HTTP请求“敲门”询问你的网站:“你还活着吗?你响应得快吗?”

核心原理拆解:脚本监控到底在“盯”什么?

监控脚本的底层逻辑并不复杂,它主要围绕三个核心指标展开:

  • 可用性(HTTP状态码):服务器是否返回了预期的状态码?正常的200表示一切安好;301/302是重定向;而403/404/500/502/503则意味着访问受限或服务异常,脚本需要建立一个“白名单”,凡是非2xx3xx的状态码,一律视为异常。
  • 性能(响应时间):即使网站返回了200状态码,如果响应时间超过5秒,用户体验依然极差,监控脚本需要计算从发出请求到接收完整响应头的时间(TTFB,即首字节时间),若超过阈值(如3秒),应触发“性能黄色警报”,校验(关键字匹配)**:这是高级玩法,有些网站即使返回200,但页面关键部分(如登录框、购物车图标)可能因程序错误而消失,脚本可以抓取页面HTML,用正则匹配关键字符串,如果缺失则判定为“部分失败”。

手把手实战:从零编写可用的监控脚本(HTTP状态码 + 响应时间)

我们使用最通用的Python语言,配合requests库来构建核心逻辑,即使你不是程序员,也只需复制以下代码块,修改域名即可运行。

import requests
import time
import smtplib
from email.mime.text import MIMEText
import datetime
# --- 配置区 ---
TARGET_URL = "https://你的域名.com"  # 要监控的网址
EXPECTED_STATUS = 200                # 期望的状态码
TIMEOUT_THRESHOLD = 3.0              # 响应超时阈值(秒)
CHECK_INTERVAL = 60                  # 检测间隔(秒)
# --- 邮件配置(用于警报)---
ALERT_EMAIL = "你的邮箱@qq.com"
SMTP_SERVER = "smtp.qq.com"
SMTP_PORT = 465
SMTP_USERNAME = "你的邮箱@qq.com"
SMTP_PASSWORD = "你的授权码"  # 非密码,是SMTP授权码
def send_alert(subject, message):
    """发送警报邮件(简版)"""
    msg = MIMEText(message)
    msg['Subject'] = subject
    msg['From'] = SMTP_USERNAME
    msg['To'] = ALERT_EMAIL
    try:
        with smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) as server:
            server.login(SMTP_USERNAME, SMTP_PASSWORD)
            server.send_message(msg)
        print(f"[{datetime.datetime.now()}] 警报邮件发送成功")
    except Exception as e:
        print(f"邮件发送失败: {e}")
def check_website():
    """核心检测函数"""
    start_time = time.time()
    try:
        # 设置超时时间,防止请求挂死
        response = requests.get(TARGET_URL, timeout=TIMEOUT_THRESHOLD, allow_redirects=True)
        elapsed_time = time.time() - start_time
        status_code = response.status_code
        msg = f"状态码: {status_code} | 响应时间: {elapsed_time:.2f}秒"
        if status_code != EXPECTED_STATUS:
            print(f"[告警] {msg} - 状态码异常!")
            send_alert(f"网站异常告警:{TARGET_URL}", f"检测到状态码为 {status_code},期望为 {EXPECTED_STATUS}。")
        elif elapsed_time > TIMEOUT_THRESHOLD:
            print(f"[警告] {msg} - 响应过慢!")
            send_alert(f"性能告警:{TARGET_URL}", f"响应时间 {elapsed_time:.2f}秒 超过阈值 {TIMEOUT_THRESHOLD}秒。")
        else:
            print(f"[正常] {msg}")
    except requests.exceptions.Timeout:
        send_alert("网站超时告警", f"{TARGET_URL} 请求超时(> {TIMEOUT_THRESHOLD}秒)。")
    except requests.exceptions.ConnectionError:
        send_alert("网站无法连接", f"{TARGET_URL} DNS解析失败或TCP连接被拒绝。")
    except Exception as e:
        send_alert("未知异常", f"检测出错:{str(e)}")
if __name__ == "__main__":
    print("网站状态监控脚本已启动(Ctrl+C停止)")
    while True:
        check_website()
        time.sleep(CHECK_INTERVAL)  # 休眠60秒后再次检测

运行方法:将上述代码保存为monitor.py,在终端执行pip install requests后,运行python monitor.py即可。

进阶警报机制:当网站挂了,如何第一时间通知你?

上述代码已经包含了邮件警报,若要接入更实时的渠道,推荐以下方案(只需在send_alert函数中添加逻辑即可):

  • 企业微信/钉钉机器人:通过Webhook地址发送POST请求,这是最推荐的方式,因为无需额外配置SMTP,且推送速度快,只需在群聊中添加机器人,复制Webhook链接,用requests.post发送JSON数据即可。
  • Server酱(ServerChan):一个专门为程序员设计的微信推送服务,断连检测非常灵敏。
  • 短信或电话:对于关键核心业务,建议使用云厂商的SMS服务,但成本较高,通常仅在连续3次探测失败后才触发。

高频问答:关于监控频率、误报处理、分布式监控的深度解答

Q1:监控频率多久合适?是不是越快越好? A: 并非越快越好,过高的频率(如1秒一次)会消耗服务器连接资源,且可能被防火墙视为攻击,对于普通中小网站,建议60秒~5分钟一次,对于电商可用性要求极高的站点,推荐15秒一次,但需使用轻量级的HEAD请求(只获取响应头)来降低负载。

Q2:如何处理监控误报(比如网络抖动)? A: 业界标准做法是“交叉验证”,不要本地单点探测,而是使用多台服务器(或云函数)从不同地理位置(如阿里云华北、腾讯云华南)同时探测,只有当超过2个点同时失败时,才判定为真宕机,在代码层面,可以增加“连续失败N次才告警”的逻辑,例如连续3次失败(间隔30秒)后才触发警报,有效规避瞬时网络波动。

Q3:能否监控网页中的特定JS是否渲染成功? A: 基础脚本只能获取静态HTML,若要监控JavaScript渲染后的状态,需要使用无头浏览器(如SeleniumPlaywright模拟浏览器),这种方式更接近真实用户,但资源占用大,适合对核心页面(如登录流程)做低频(每10分钟一次)的深度巡检。

Q4:这个脚本能防住DDoS攻击吗? A: 不能,脚本是“哨兵”,不是“盾牌”,它能帮你快速发现攻击导致的宕机,但防御需要依赖CDN、WAF等云安全产品,脚本的价值在于 “缩短发现时间” ,减少业务损失。

监控脚本的最佳实践与避坑指南

  • 日志记录:务必在脚本中加入日志模块(如logging),记录每次检测的状态、响应时间和错误信息,便于事后分析趋势。
  • 自恢复尝试:高级脚本可在检测到故障后,尝试通过API调用重启Docker容器或拉起服务进程(但需做好权限控制)。
  • 安全注意:如果脚本部署在公网服务器,必须对告警接口做鉴权,防止被人恶意刷接口导致短信费爆掉。
  • 动态阈值:对于有促销活动的网站,流量高峰时响应时间变长是正常的,建议通过历史数据统计,按小时动态调整性能阈值,减少无效告警。

请牢记:监控脚本不是一次性工具,而是需要持续迭代的运维资产,当你今天花了半小时部署这个脚本,未来它将在无数个深夜为你守住“最后一班岗”,帮你避免被手机铃声从噩梦中惊醒的狼狈,现在就动手,用代码给自己装上“第三只眼”吧。

抱歉,评论功能暂时关闭!