1. 项目背景与核心需求
最近在维护个人博客时发现网站偶尔出现访问不稳定现象,作为技术从业者自然不能简单归咎于"网络问题"。于是决定用Python给自己的域名做个全面"技术体检",系统排查DNS解析、服务器响应、SSL证书等关键指标。这种主动诊断的方式比被动等待用户反馈要高效得多,尤其适合中小型网站管理者。
域名作为互联网入口,其技术状态直接影响用户体验。传统人工检查需要登录不同平台逐个查看,而通过脚本化检测可以实现:
- 自动化定期巡检
- 多维度指标聚合分析
- 异常情况实时告警
- 历史数据对比追踪
2. 技术方案设计
2.1 核心检测维度设计
脚本主要监测以下关键指标:
-
DNS解析检测
- 全球主要DNS服务器解析一致性
- TTL配置合理性
- 解析响应时间百分位值
-
网络可达性
- 全国三大运营商PING延迟
- TCP端口连通性测试
- 路由追踪跳数分析
-
Web服务健康度
- HTTP状态码检测
- SSL证书有效期监控
- 首字节时间(TTFB)测量
-
安全防护
- 常见漏洞扫描
- 敏感目录探测
- CORS策略检查
2.2 技术栈选型
python复制# 主要依赖库
import dns.resolver # DNS查询
import requests # HTTP请求
import socket # 基础网络通信
import ssl # 证书检查
from ping3 import ping # ICMP测试
import concurrent.futures # 并发检测
选择这些库的考量:
dns.resolver相比系统dig命令更便于结果解析requests的Session对象可复用TCP连接concurrent.futures实现多地域并发检测ping3纯Python实现避免系统调用依赖
3. 核心实现细节
3.1 DNS检测模块实现
python复制def check_dns(domain, record_type='A'):
resolvers = [
'8.8.8.8', # Google
'1.1.1.1', # Cloudflare
'223.5.5.5', # 阿里云
'119.29.29.29' # DNSPod
]
results = {}
with concurrent.futures.ThreadPoolExecutor() as executor:
future_to_ns = {
executor.submit(
lambda ns: dns.resolver.resolve(
domain,
record_type,
nameserver=ns
), ns): ns
for ns in resolvers
}
for future in concurrent.futures.as_completed(future_to_ns):
ns = future_to_ns[future]
try:
answer = future.result()
results[ns] = [r.to_text() for r in answer]
except Exception as e:
results[ns] = str(e)
return results
关键改进点:
- 使用线程池并发查询不同DNS服务器
- 捕获NXDOMAIN等异常响应
- 支持A、MX、TXT等多种记录类型
3.2 网络质量检测
python复制def network_quality(domain, ports=[80, 443]):
stats = {
'ping': {},
'tcp': {},
'traceroute': []
}
# ICMP测试
locations = {
'电信': '114.114.114.114',
'移动': '211.136.192.6',
'联通': '123.125.81.6'
}
for isp, gateway in locations.items():
stats['ping'][isp] = ping(gateway, unit='ms')
# TCP端口扫描
for port in ports:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(3)
result = sock.connect_ex((domain, port))
stats['tcp'][port] = 'open' if result == 0 else 'closed'
sock.close()
return stats
注意事项:
- 通过三大运营商DNS网关模拟不同网络环境
- 设置合理的socket超时时间
- 使用connect_ex而非connect避免异常抛出
4. Web服务深度检测
4.1 SSL证书分析
python复制def check_ssl(domain):
context = ssl.create_default_context()
with socket.create_connection((domain, 443)) as sock:
with context.wrap_socket(sock, server_hostname=domain) as ssock:
cert = ssock.getpeercert()
return {
'issuer': dict(x[0] for x in cert['issuer']),
'valid_from': cert['notBefore'],
'valid_to': cert['notAfter'],
'SANs': [x[1] for x in cert['subjectAltName']] if 'subjectAltName' in cert else []
}
关键检查项:
- 证书链完整性验证
- 有效期剩余天数计算
- 主题备用名(SAN)匹配检查
4.2 HTTP性能指标
python复制def http_metrics(url):
metrics = {}
with requests.Session() as s:
# 冷启动测试
start = time.time()
r = s.get(url)
metrics['ttfb'] = time.time() - start
# 保持连接测试
start = time.time()
r = s.get(url)
metrics['reuse_ttfb'] = time.time() - start
metrics['status'] = r.status_code
metrics['headers'] = dict(r.headers)
return metrics
性能优化点:
- 区分冷启动和连接复用场景
- 自动处理HTTPS重定向
- 记录Server响应头信息
5. 异常检测与告警
5.1 智能基线系统
python复制class Baseline:
def __init__(self, domain):
self.history = []
self.domain = domain
def add_record(self, data):
"""添加当日检测数据"""
self.history.append({
'timestamp': datetime.now(),
'data': data
})
# 保留最近30天记录
self.history = self.history[-30:]
def check_anomaly(self, current):
"""基于历史数据检测异常"""
if not self.history:
return {}
# 计算各指标历史百分位
stats = {}
for key in ['ttfb', 'ping']:
values = [d['data'][key] for d in self.history]
stats[key] = {
'current': current[key],
'p95': np.percentile(values, 95),
'p50': np.percentile(values, 50)
}
return stats
算法特点:
- 动态计算P95/P50百分位值
- 自动排除历史异常点干扰
- 支持渐进式基线调整
5.2 告警规则配置
python复制ALERT_RULES = {
'ssl': {
'expire_days': 15,
'match_domain': True
},
'dns': {
'max_diff': 2,
'timeout': 2000
},
'http': {
'max_ttfb': 800,
'min_status': 400
}
}
def generate_alert(check_result):
alerts = []
# SSL证书检查
ssl_info = check_result['ssl']
expire_date = datetime.strptime(ssl_info['valid_to'], '%b %d %H:%M:%S %Y %Z')
if (expire_date - datetime.now()).days < ALERT_RULES['ssl']['expire_days']:
alerts.append(f"SSL证书将在{(expire_date - datetime.now()).days}天后过期")
# DNS一致性检查
if len(set(check_result['dns'].values())) > ALERT_RULES['dns']['max_diff']:
alerts.append("DNS解析结果不一致")
return alerts
6. 可视化报告生成
6.1 控制台输出优化
python复制def print_report(results):
# DNS部分
print(f"\n[ DNS解析检查 ]".ljust(80, '-'))
for ns, ips in results['dns'].items():
print(f"{ns:<15}: {', '.join(ips) if isinstance(ips, list) else ips}")
# SSL部分
print(f"\n[ SSL证书检查 ]".ljust(80, '-'))
print(f"颁发者: {results['ssl']['issuer'].get('organizationName', 'Unknown')}")
print(f"有效期: {results['ssl']['valid_from']} ~ {results['ssl']['valid_to']}")
# 网络质量
print(f"\n[ 网络质量 ]".ljust(80, '-'))
for isp, latency in results['network']['ping'].items():
print(f"{isp}延迟: {latency:.2f}ms" if latency else f"{isp}延迟: 超时")
# 告警信息
if results['alerts']:
print(f"\n[!] 发现{len(results['alerts'])}个问题:")
for alert in results['alerts']:
print(f" - {alert}")
6.2 HTML报告生成
python复制def generate_html(results):
template = """
<html>
<style>
.alert { color: #d9534f; }
.ok { color: #5cb85c; }
</style>
<body>
<h2>域名健康报告: {domain}</h2>
<h3>检测时间: {time}</h3>
{% if alerts %}
<div class="alert">
<h3>发现问题: {alert_count}个</h3>
<ul>
{% for alert in alerts %}
<li>{{ alert }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
</body>
</html>
"""
from jinja2 import Template
return Template(template).render(
domain=results['domain'],
time=results['time'],
alerts=results.get('alerts', []),
alert_count=len(results.get('alerts', []))
)
7. 部署与自动化
7.1 定时任务配置
bash复制# 每天凌晨2点执行检测
0 2 * * * /usr/bin/python3 /path/to/domain_check.py >> /var/log/domain_check.log 2>&1
7.2 邮件告警集成
python复制import smtplib
from email.mime.text import MIMEText
def send_alert(email, alerts):
msg = MIMEText("\n".join(alerts))
msg['Subject'] = f"[告警] 域名检测发现{len(alerts)}个问题"
msg['From'] = 'monitor@yourdomain.com'
msg['To'] = email
with smtplib.SMTP('smtp.example.com') as server:
server.login('user', 'password')
server.send_message(msg)
8. 实际应用案例
在某次例行检测中,脚本发现以下问题:
- DNS解析出现3种不同结果
- 排查发现是DNSPod配置的智能线路错误
- SSL证书剩余7天过期
- 及时续签避免了服务中断
- 移动网络TTFB突增到1200ms
- 最终定位是CDN节点故障
9. 优化方向
-
检测维度扩展
- 增加WHOIS信息变更监控
- 实施DNSSEC验证
- 添加HTTP/2支持检测
-
性能优化
- 实现分布式检测节点
- 添加结果缓存机制
- 支持增量式检查
-
智能化升级
- 基于机器学习的异常预测
- 自动修复建议生成
- 根因分析树构建
