如何用脚本监控网站响应时间?

wen 实用脚本 2

本文目录导读:

如何用脚本监控网站响应时间?

  1. 方法一:使用 Shell 脚本(Linux/Mac,依赖 curl)
  2. 方法二:使用 Python 脚本(跨平台,更灵活)
  3. 方法三:使用 Node.js 脚本(适合前端开发者)
  4. 高级用法:持续监控与警报(结合 cron 或定时任务)
  5. 关键注意事项
  6. 推荐方案

要用脚本监控网站响应时间,最常用的方式是通过HTTP请求来测量从发送请求到收到完整响应所花费的时间,以下是几种常见的脚本方法,从简单到复杂,供你参考。

使用 Shell 脚本(Linux/Mac,依赖 curl)

这是最简单、最快速的方法。curl 命令提供了 -o /dev/null -s -w 选项来输出详细的时间信息。 (monitor_curl.sh):**

#!/bin/bash
# 要监控的网站
TARGET_URL="https://www.example.com"
# 使用 curl 进行请求,-o 忽略下载内容,-s 静默模式,-w 输出自定义格式
# connect_time: 连接时间 (TCP 握手完成)
# starttransfer_time: 开始传输首字节的时间 (TTFB)
# total_time: 总请求时间(从开始到完成)
result=$(curl -o /dev/null -s -w "connect_time:%{time_connect}\ntime_starttransfer:%{time_starttransfer}\ntotal_time:%{time_total}\nhttp_code:%{http_code}" "$TARGET_URL")
# 解析结果
echo "--- 网站响应时间报告 ---"
echo "URL: $TARGET_URL"
echo "$result"
echo "-------------------------"
# 可选:判断总时间是否超过阈值(2 秒)
total=$(echo "$result" | grep "total_time" | cut -d: -f2)
if (( $(echo "$total > 2.0" | bc -l) )); then
    echo "警告:响应时间超过 2 秒!"
fi

使用方法:

  1. chmod +x monitor_curl.sh
  2. 设置 TARGET_URL 为你的目标网站。
  3. 运行 ./monitor_curl.sh

输出示例:

--- 网站响应时间报告 ---
URL: https://www.example.com
connect_time:0.123
time_starttransfer:0.456
total_time:0.789
http_code:200
-------------------------

时间指标说明:

  • connect_time:建立 TCP 连接所用的时间(秒)。
  • time_starttransfer:从请求开始到服务器开始发送第一个字节的时间(TTFB,秒),代表服务器处理延迟。
  • total_time:整个请求完成的时间(秒),是用户感知的关键指标。
  • http_code:HTTP 状态码,200 表示正常。

使用 Python 脚本(跨平台,更灵活)

Python 的 requests 库内置了请求耗时属性,非常适合监控,如果需要更高级的指标(如 DNS 解析时间、SSL 握手时间),可以使用 pycurl。 (monitor_py.py):**

import requests
import time
from datetime import datetime
def monitor_website(url, timeout=10):
    """
    监控指定网站的响应时间
    返回: 字典包含各种时间指标
    """
    start_time = time.time()
    try:
        response = requests.get(url, timeout=timeout)
        elapsed = response.elapsed.total_seconds()
        end_time = time.time()
        # 计算网络层面的往返时间(RTT)
        rtt = end_time - start_time
        report = {
            "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            "url": url,
            "status_code": response.status_code,
            "response_time_elapsed": round(elapsed, 3),  # 从发送请求到收到响应头部
            "rtt_approx": round(rtt, 3),  # 近似总耗时(包括 DNS 解析等)
            "success": response.ok
        }
        return report
    except requests.exceptions.Timeout:
        return {"url": url, "error": "请求超时", "success": False}
    except requests.exceptions.RequestException as e:
        return {"url": url, "error": str(e), "success": False}
def main():
    target = "https://www.example.com"
    result = monitor_website(target)
    print("--- 网站响应时间报告 ---")
    for key, value in result.items():
        print(f"{key}: {value}")
    # 判断是否异常(阈值 3 秒)
    if result.get("success") and result.get("response_time_elapsed", 0) > 3:
        print("⚠️ 警告:响应时间超过 3 秒!")
    elif not result.get("success"):
        print("❌ 错误:网站无法正常访问!")
if __name__ == "__main__":
    main()

运行方式:

python3 monitor_py.py

优点: 容易扩展,可以加入数据记录(写入 CSV)、发送警报(邮件、钉钉)等功能。

使用 Node.js 脚本(适合前端开发者)

(monitor_node.js):**

const http = require('http');
const https = require('https');
function monitorWebsite(url, callback) {
    const startTime = process.hrtime();
    const module = url.startsWith('https') ? https : http;
    const request = module.get(url, (response) => {
        const hrTime = process.hrtime(startTime);
        const timeInMs = (hrTime[0] * 1000) + (hrTime[1] / 1000000); // 转换为毫秒
        let data = '';
        response.on('data', (chunk) => { data += chunk; });
        response.on('end', () => {
            callback(null, {
                url: url,
                statusCode: response.statusCode,
                responseTimeMs: timeInMs,
                timestamp: new Date().toISOString()
            });
        });
    });
    request.on('error', (err) => {
        callback(err, null);
    });
    request.setTimeout(10000, () => {
        request.destroy();
        callback(new Error('请求超时'), null);
    });
}
// 使用示例
const targetUrl = 'http://www.example.com';
monitorWebsite(targetUrl, (err, result) => {
    if (err) {
        console.error('监控失败:', err.message);
        return;
    }
    console.log('--- 网站响应时间报告 ---');
    for (const [key, value] of Object.entries(result)) {
        console.log(`${key}: ${value}`);
    }
    if (result.responseTimeMs > 2000) {
        console.log('⚠️ 警告:响应时间超过 2 秒!');
    }
});

运行方式:

node monitor_node.js

高级用法:持续监控与警报(结合 cron 或定时任务)

  1. 使用 Linux 定时任务(cron)每一分钟运行监控脚本:

    crontab -e
    # 添加这一行(每一分钟执行一次,将日志追加到 monitor.log)
    * * * * * /path/to/monitor_curl.sh >> /var/log/website_monitor.log 2>&1
  2. 使用 Python 脚本记录历史数据并分析: 可以将每次监控结果写入 CSV 文件,然后用 Excel 或 Grafana 可视化趋势。

关键注意事项

  1. 网络波动:单次请求不能代表网站真实状态,建议多次取平均(如每分钟一次)。
  2. 区分指标
    • 响应时间(TTFB):反映服务器处理能力。
    • 总时间:反映用户端体验,受网络带宽和距离影响大。
  3. 添加重试机制:避免因临时网络抖动导致误报警。
  4. 资源消耗:频繁请求可能会被服务器视为攻击,很多站点(如阿里云、AWS)有速率限制,建议请求间隔 ≥ 30 秒。

推荐方案

  • 最简单:Shell + curl,适合 Linux 运维。
  • 最灵活:Python + requests,适合需要记录数据分析趋势的场景。
  • 最专业:使用现有的监控工具如 Prometheus + Blackbox ExporterNagios,它们专为这种任务设计,性能更好、配置更丰富。

你倾向于哪种环境?我可以帮你调整脚本或补充更多细节。

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