1.
概述与背景
本段介绍案例背景与目标。
项目为一个中型内容站点,日均请求峰值约3万次/日。
目标是在接入CDN后降低带宽、缩短页面加载和降低源站负载。
接入前使用自建VPS承载(参考配置见下文),存在高并发下响应不稳的问题。
接入CDN后出现“部分指标变慢”的反常现象,需要完整的排查和调优流程。
本文以真实监控数据和调优步骤为主线,给出可复制的配置建议。
2.
初始环境与服务器配置示例
列出源站与域名的关键配置以便复现和诊断。
源站(示例):VPS 提供商:示例机房;IP:203.0.113.45;系统:Ubuntu 20.04。
硬件配置:2 vCPU、4 GB 内存、40 GB NVMe;Web:Nginx 1.18 + PHP-FPM 7.4 + MySQL 5.7。
域名解析:A 记录指向源站,原 TTL 为 300s;接入CDN后采用 CNAME 指向 CDN 提供商。
安全与防护:初始仅安装 fail2ban,无完整WAF;未配置源站隐藏(origin shielding)。
这套配置在不接CDN时,中等并发下能稳定响应,但峰值时 TTFB 与 I/O 成为瓶颈。
3.
接入CDN后观测到的问题
接入CDN(示例:某全球CDN)后的第一天出现了性能回退。
观测指标:TTFB 从约 600ms 升至 900ms,完全加载时间从 4.2s 到 5.6s。
CPU 与带宽使用量短期下降,但源站的并发连接数反而上升(KeepAlive 配置不当)。
CDN面板显示缓存命中率非常低(初始 <10%),大量请求穿透到源站。
部分资源 SSL 握手耗时增加,CDN 与源站之间的 HTTPS 重协商导致额外延迟。
4.
问题诊断与定位步骤
第一步:在多个节点进行端到端抓包(curl -Lv 和 tcpdump)确认是否为协议或重定向问题。
第二步:检查 CDN 设置的缓存规则,确认是否因为 Cookie、Query String 或 Cache-Control 导致回源。
第三步:查看源站 Nginx 日志(access.log/error.log),定位回源请求的类型(静态/动态、状态码)。
第四步:排查 SSL 设置,确认是否为“Flexible/Full/Full(strict)”等模式不当,导致握手两次。
第五步:检查 TCP/TLS 参数(KeepAliveTimeout、worker_connections、ssl_session_cache、OCSP stapling)以及原始带宽/IO 表现。
第六步:结合监控(Grafana/Prometheus)检查 p95/p99 响应时间分布,确定是否为少数慢请求影响整体体验。
5.
具体调优措施与配置细节
调整并制定了一套逐步措施,从 CDN 到源站同时优化:
1) CDN 侧:增加缓存规则,按路径和文件扩展名强制缓存静态资源(Cache-Control: public, max-age=31536000)。
2) CDN 侧:开启边缘压缩(Brotli/Gzip)、HTTP/2 和 TLS 1.3,启用边缘缓存键忽略特定 Cookie 和无关 Query。
3) 源站 Nginx:调整 worker_processes=auto,worker_connections=4096,开启 keepalive_timeout 65,tcp_nodelay on。
4) 源站缓存与压缩:开启 gzip/brotli、开启 fastcgi_cache(对可缓存的动态页面设置缓存时间),并配置缓存键包含 Host 与 URI。
5) SSL 与连接优化:启用 ssl_session_cache shared:SSL:10m,ssl_session_timeout 1d,开启 OCSP stapling 减少客户端延迟。
6) DDoS 与访问控制:在 CDN 层启用基本速率限制和 WAF 规则,源站配置 fail2ban 和 iptables 严格只允许 CDN IP 回源(封锁直接访问)。
7) DNS 与域名:将 DNS TTL 调整为 60s,使用 CNAME flatten 或 ANAME 保证根域兼容 CDN;同时配置源站隐藏(Origin Shield)以减少回源压力。
8) 测试与渐进发布:逐个POP启用策略,优先给高命中率节点下发,观察缓存命中率与回源下降情况。
6.
调优前后数据对比(真实监控示例)
下面的对比表格展示关键性能指标的变化(数值为示例观测值,单位已标注):
| 指标 |
接入前(源站直连) |
接入CDN初期(未优化) |
调优后(最终) |
| TTFB(中位) |
600 ms |
900 ms |
120 ms |
| 完整页面加载(中位) |
4.2 s |
5.6 s |
1.1 s |
| 缓存命中率 |
0%(无CDN) |
<10% |
86% |
| 源站带宽/流量 |
100%(基线) |
约 60% |
约 22%(下降78%) |
| 最大并发连接数(源站) |
~800 |
~1200(大量穿透) |
~300 |
表格居中且文字居中,上述数据在接入CDN初期的回源高峰期采集,调优后数据为连续7天稳定期的平均值。
7.
真实案例结论与可复用建议
案例结论:接入CDN并非自动提速,需同步优化缓存策略、源站配置与协议设置。
关键教训1:缓存策略不当(默认携带Cookie/Query)会导致大量回源,反而增加延迟。
关键教训2:SSL/TLS 双端不一致或禁用 session/resumption 会增加握手延迟。
关键教训3:未限制源站只允许 CDN 回源会暴露真实 IP,带来安全和性能风险(建议仅允许 CDN IP 回源)。
推荐动作清单:制定缓存白名单、开启边缘压缩和 HTTP/2、调整 Nginx TCP/TLS 参数、启用 Origin Shield、在 CDN 层配置 WAF 与速率限制。
最后注意:在生产上线每一步改动都要做 A/B 验证并保存回滚点,结合监控(TTFB、p95、缓存命中率和流量)判断效果。