【实战】别再只盯着状态码了!用Python写个脚本监控360CDN的“真实”回源健康度
·
前两天咱们聊了缓存刷新,后台有不少兄弟问:“脚本是写好了,但怎么知道这脚本运行得稳不稳?万一CDN节点挂了,或者源站抽风了,我怎么第一时间知道?”
靠人工刷新页面?那是2010年的玩法了。
今天,我直接分享一个我自己在用的“CDN源站健康监控脚本”。它不依赖第三方监控平台,直接利用Python的requests库,模拟真实用户和搜索引擎蜘蛛,对CDN节点进行“压力测试”。
一、为什么要自己写监控?
市面上的监控工具(如博瑞、听云)虽然强大,但大多是从外部探测CDN边缘节点。
痛点在于:它们很难探测到“回源”链路的健康状况。
有时候,边缘节点是通的(返回200),但其实是CDN的备用缓存,源站早就挂了。这种“假活”状态最坑人。
二、核心代码逻辑
这个脚本的核心思路是:
- 强制回源:在请求头中加上
Cache-Control: no-cache,绕过CDN缓存,直接探测源站。 - 模拟蜘蛛:随机切换User-Agent(百度、360、Google),检测是否被WAF误杀。
- 多节点探测:通过DNS解析获取多个CDN IP,轮询测试。
python
编辑
1import requests
2import dns.resolver
3import time
4import random
5
6# 目标域名
7TARGET_URL = "https://www.yourdomain.com"
8# 模拟的搜索引擎蜘蛛UA
9SPIDER_UAS = [
10 "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",
11 "Mozilla/5.0 (compatible; 360Spider/1.0; +http://www.so.com/help/help_3_2.html)"
12]
13
14def get_cdn_ips(domain):
15 """获取域名对应的CDN节点IP列表"""
16 try:
17 answers = dns.resolver.resolve(domain, 'A')
18 return [rdata.address for rdata in answers]
19 except Exception as e:
20 print(f"❌ DNS解析失败: {e}")
21 return []
22
23def check_origin_health(ip):
24 """模拟强制回源检查"""
25 headers = {
26 "Host": TARGET_URL.split("//")[1], # 必须指定Host,否则源站不知道你是谁
27 "User-Agent": random.choice(SPIDER_UAS),
28 "Cache-Control": "no-cache" # 关键:跳过CDN缓存
29 }
30
31 try:
32 # 直接请求IP,不通过DNS(模拟指定节点)
33 url = f"https://{ip}/"
34 start_time = time.time()
35 response = requests.get(url, headers=headers, timeout=5, verify=False)
36 latency = (time.time() - start_time) * 1000
37
38 if response.status_code == 200:
39 print(f"✅ 节点 {ip} 健康 | 耗时: {latency:.2f}ms | UA: {headers['User-Agent']}")
40 else:
41 print(f"⚠️ 节点 {ip} 异常 | 状态码: {response.status_code}")
42
43 except Exception as e:
44 print(f"❌ 节点 {ip} 连接超时或错误: {e}")
45
46if __name__ == "__main__":
47 domain = TARGET_URL.split("//")[1]
48 ips = get_cdn_ips(domain)
49
50 print(f"🔍 正在检测域名: {domain}, 共发现 {len(ips)} 个CDN节点...")
51 for ip in ips:
52 check_origin_health(ip)
53 time.sleep(1) # 避免触发WAF
三、避坑指南
- Host头不能忘:直接请求IP时,如果不指定
Host头,源站(尤其是Nginx)会返回默认站点或404,导致误报。 - WAF误伤:如果你的源站WAF很严格,高频请求可能会被封锁。建议把这个脚本放到内网服务器跑,或者把监控服务器IP加入白名单。
- HTTPS证书:脚本里用了
verify=False跳过证书验证,生产环境建议配置好证书路径,确保证书没过期。
四、总结
这套脚本我配合了钉钉机器人的Webhook,一旦连续3次检测失败,直接群里报警。
做运维,“睡个好觉”比什么都重要。希望这个小工具能帮大家守住网站的最后一道防线。
更多推荐
所有评论(0)