1.
概述:为什么要在二级目录使用CDN且与主域名协同缓存
(1)在二级目录(如 example.com/blog/)使用CDN可以显著降低源站带宽与CPU占用。
(2)主域名与二级目录若同域名协同缓存,可避免跨域Cookie导致的缓存失效。
(3)合理的协同缓存策略能把静态资源命中率从20%提升到80%以上,减少源服务器请求数。
(4)针对不同内容类型(HTML/JSON/静态资源)设置差异化TTL,可兼顾实时性与性能。
(5)运维需兼顾DDoS防护、缓存刷新策略、以及SEO友好URL,避免因CDN错误导致搜索引擎抓取问题。
2.
常见架构与限制:CDN对二级目录的方式
(1)CDN通常基于域名(CNAME)工作,直接对二级路径缓存需要反向代理或Workers/Edge脚本来实现。
(2)常见方案:将二级目录反向代理到独立子域(blog.example.com)并由CDN处理,或使用Cloudflare Worker做路径路由。
(3)限制示例:CloudFront原生不支持按路径分配不同CNAME,但可在边缘实现缓存控制。
(4)运维上需要保证Cookie与Cache-Control头在主域和二级目录间的一致性。
(5)建议评估HTTPS证书覆盖(主域与子域或通配符)与HSTS策略以避免证书冲突。
3.
配置示例:Nginx 反向代理 + CDN 边缘缓存策略
(1)目标:把 /blog/ 反向代理到本地后端 127.0.0.1:8081,并让CDN缓存静态与HTML。
(2)Nginx 关键配置示例(生产环境示例,VPS:2vCPU/4GB/80GB SSD,带宽1Gbps):
location /blog/ {
proxy_pass http://127.0.0.1:8081/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
add_header Cache-Control "public, max-age=600";
}
(3)在CDN(例如 Cloudflare/CloudFront)边缘,设置HTML ttl=300s,静态资源(.css,.js,.jpg)ttl=86400s。
(4)服务器端设置示例:Apache/NGINX在返回HTML时添加 Surrogate-Control: max-age=300,Surrogate-Key: blog-page。
(5)需要在源站与CDN上保持一致的缓存键:Host + URL + Accept-Encoding,并根据Query参数选择是否缓存。
4.
TTL 与缓存规则表(示例数据)
(1)下面表格演示了建议的资源类型、源站头部与CDN边缘TTL的对应关系。
| 资源类型 | 源站 Cache-Control | Surrogate-Control (CDN) | CDN TTL (秒) | 备注 |
| HTML 页面 | Cache-Control: private, max-age=0, no-cache | Surrogate-Control: max-age=300 | 300 | 动态但允许边缘短缓存 |
| 静态 CSS/JS | Cache-Control: public, max-age=31536000 | 无需 | 31536000 | 指纹化文件长期缓存 |
| 图片 (jpg/png) | Cache-Control: public, max-age=604800 | 无需 | 604800 | 每周更新策略 |
| API /ajax | Cache-Control: no-store | 无 | 0 | 实时数据,不缓存 |
(2)表中TTL为常用推荐值,实际根据业务可放宽或收紧。
(3)示例测算:若原始带宽峰值1000Mbps,CDN缓存率80%后源站带宽降为200Mbps。
(4)按月计:若流量 10TB/月,80%由CDN承担,源站只需处理2TB;节省带宽费用显著。
(5)请在CDN控制台启用按路径或按扩展名的缓存规则以匹配上表策略。
5.
真实案例:某公司 blog 二级目录改造实录
(1)背景:Acme 公司原本 blog 在 example.com/blog/ 直接由阿里云ECS(4vCPU/8GB)提供,月流量 6TB,峰值 300Mbps。
(2)改造:使用 Cloudflare 作为CDN,采用 Worker 将 /blog/* 路径代理到 blog.example.com,源站 Nginx 做 Surrogate-Control。
(3)配置数据:源站 Nginx proxy_cache 缓存命中率从 12% 提升到 78%;源站带宽峰值由 300Mbps 降至 60Mbps。
(4)缓存规则:HTML TTL=180s,静态 TTL=30天;并在发布后通过 API 调用 Cloudflare 缓存清理 endpoint 批量刷新 Surrogate-Key。
(5)结果:月带宽费用下降约 62%,页面平均加载时间从 1.8s 降至 0.6s,SEO 索引未受影响。
6.
DDoS 防护与缓存失效应对策略
(1)边缘CDN(Cloudflare/阿里云 CDN)提供速率限制、WAF与L7防护,应优先启用以抵御DDoS。
(2)源站配置:在Nginx启用 limit_req_zone/limit_conn_zone,配合 fail2ban 阻断恶意IP。示例:limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s。
(3)缓存失效场景:发布时批量刷新策略使用 Surrogate-Key 标记资源,做到精确刷新而非全站刷新。
(4)当遇到突发流量时,可在CDN配置临时缓存加长(临时提升HTML TTL至600s)减轻源站压力。
(5)常规监控:使用 Grafana+Prometheus 监控源站 95th p99 延迟、缓存命中率、流量与 HTTP 状态码,设置告警阈值并联动自动化清理脚本。
7.
运维检查清单与部署步骤
(1)准备:确认证书覆盖(通配符或主/子域)、DNS 指向以及CDN账号权限。
(2)实现:在源站部署 proxy_cache 与 Surrogate-Control,配置 Nginx 示例并测试本地缓存命中。
(3)CDN端:添加路径规则、Edge TTL、WAF 策略,并通过API测试缓存刷新/预热接口。
(4)验证:用 curl -I 检查边缘返回头(CF-Cache-Status/ X-Cache)和源站头部是否按预期。示例:curl -I https://example.com/blog/ | grep -E "Cache|CF-Cache-Status".
(5)运营:建立发布流程(发布时触发针对性刷新),并在变更后72小时内观察缓存效果与搜索引擎抓取情况。
来源:运维手册 二级目录网站使用cdn 与主域名协同缓存配置