Day31-17|10.6.6 大型网站系统架构演化实例(六):反向代理与 CDN 加速响应
Day31-17|10.6.6 大型网站系统架构演化实例(六):反向代理与 CDN 加速响应
一、教材定位
当网站用户分布扩大、静态资源和公共内容访问量持续增加时,仅依靠应用集群、缓存和数据库读写分离,仍可能受到网络距离、源站带宽和入口压力限制。反向代理和内容分发网络(CDN)通过在用户与源站之间增加边缘接入和缓存层,减少跨网络传输、吸收热点请求并降低源站负载,是大型网站架构演化的重要阶段。
本节重点不只是记忆 CDN 的定义,而是理解边缘缓存、反向代理、源站、回源和缓存刷新之间的关系,以及静态内容、公共动态内容和个性化内容应如何分别处理。考试案例中常见问题包括缓存数据过期、缓存键错误、回源风暴、源站暴露、HTTPS 和证书配置、用户权限泄露及 CDN 故障切换。
二、反向代理与正向代理的区别
正向代理位于客户端一侧,代表客户端访问外部资源,服务器通常不知道真实客户端;反向代理位于服务端一侧,代表源站接收客户端请求,客户端通常只看到代理地址。反向代理可以承担负载均衡、TLS 终止、缓存、压缩、限流、路由和安全防护。
反向代理隐藏源站拓扑,统一入口策略,能够在不修改应用代码的情况下改善访问性能和可用性。但代理也会引入新的配置、证书、缓存和故障点,需要高可用部署和完整监控。
三、CDN 的基本工作方式
CDN 在多个区域部署边缘节点,用户请求先通过 DNS、Anycast 或应用层调度选择较近或较合适的节点。边缘节点命中缓存时直接返回;未命中时向源站回源获取内容,按缓存规则保存后返回用户。
一次典型请求包括:域名解析、节点选择、TLS 握手、边缘缓存查找、权限和缓存键判断、回源、内容校验、缓存存储和响应。每个环节都可能影响延迟和可靠性。节点距离近不一定最快,还要考虑节点负载、网络质量、内容是否命中和源站状态。
四、适合使用 CDN 的内容
1. 静态资源
图片、脚本、样式、字体、安装包和视频通常具有重复访问、变化少和可公开分发的特点,适合使用 CDN。可以通过文件名版本化、长缓存和压缩提高命中率。
2. 公共内容
公开文章、商品详情、分类和不含个人信息的页面可以缓存,但要设计更新通知、过期时间和内容审核。公共不等于永远不变,业务发布后要保证旧内容不会长期显示。
3. 可缓存动态响应
部分动态接口可以按用户、区域、语言、设备和参数生成有限缓存。缓存键必须包含影响响应的全部条件,且不能包含未经处理的敏感标识。个性化和权限相关响应要谨慎,错误缓存可能造成数据泄露。
4. 不宜直接缓存的内容
支付、订单、账户余额、权限变更、个人信息和强一致库存等内容通常不应由公共 CDN 直接缓存。可以缓存其公共部分或使用受控的边缘计算,但必须确保认证、授权和数据新鲜度。
五、缓存控制和缓存键
缓存控制通常包括可缓存性、过期时间、验证、刷新和请求头处理。要明确浏览器、边缘和源站的缓存层次,避免一层认为可缓存、另一层认为不可缓存造成不可预测行为。
缓存键一般由 URL、查询参数、请求方法、主机、内容编码、语言、设备和必要的业务维度组成。Cookie、Authorization 和用户标识不能无意中被忽略,否则可能把一个用户的响应返回给另一个用户。查询参数排序、默认值和大小写也要统一,避免同一内容产生大量不同键。
六、缓存过期、刷新和回源
1. 时间过期
设置 TTL 简单可靠,但过长会导致旧内容,过短会增加回源。可以根据内容变化频率、业务容忍度和发布流程设置不同 TTL,并为热点内容采用提前刷新。
2. 主动刷新
内容发布、删除或安全事件发生时,通过 API、消息或管理平台清除指定键、目录或区域缓存。刷新操作要有权限、审计、限速和结果确认,避免误清全站造成回源风暴。
3. 条件验证
边缘节点携带 ETag、Last-Modified 等信息向源站验证,源站若未变化则返回未修改结果。这样可以减少内容传输,但仍会产生回源请求,不能把条件验证当成完全不访问源站。
4. 回源保护
热点内容同时失效时,大量节点可能回源。可以采用请求合并、锁、预热、随机过期、源站限流、分层回源和 stale-while-revalidate,让部分请求继续使用短时旧内容,避免源站被击穿。
七、动态内容与边缘计算
纯静态缓存无法满足个性化、地理、设备和实验分流。可以在边缘执行轻量规则,例如压缩、重写、设备判断、区域路由和安全检查;复杂业务仍应在源站执行。
边缘计算要注意代码版本、配置同步、冷启动、可观测性、权限和数据隐私。不能把核心交易状态随意复制到边缘。边缘节点故障或与源站断开时,应有降级、回源、只读旧数据或切换备用域名策略。
八、源站保护和安全
源站不应直接暴露给公网,通常只允许 CDN 节点或受控网络访问。使用源站认证、回源签名、访问控制、WAF、限流和防盗链保护资源。证书、密钥和回源凭证要集中管理并定期轮换。
要防范缓存投毒、缓存欺骗、Host 头攻击、路径穿越、未授权缓存和敏感响应缓存。缓存前要校验请求和响应头,禁止将错误页面、带用户信息的响应和权限失败响应错误地缓存为公共内容。
九、CDN 高可用和运维
CDN 可以多节点、多区域和多供应商部署,入口根据健康、延迟、成本和容量进行调度。源站也要具备多入口和故障切换能力。CDN 故障时可切换备用服务,但 DNS TTL、证书、缓存预热和回源容量要提前验证。
监控指标包括命中率、边缘延迟、回源率、回源错误、缓存刷新成功率、节点可用性、带宽、P95/P99、状态码、源站压力和内容新鲜度。命中率不是唯一目标,低命中率可能是内容高度个性化,也可能是缓存键设计错误;高命中率也可能隐藏错误或过期内容。
十、案例分析:大型网站使用 CDN 演化
某内容网站在活动期间访问量暴增,图片和脚本占据大部分带宽,源站连接数达到上限。接入 CDN 后,静态资源响应明显加快,但活动页面更新后部分用户仍看到旧内容,某次缓存规则配置错误还把带用户标识的接口响应缓存给了其他用户。
改造首先对内容分类:图片、脚本和公开页面使用长缓存与版本化文件名;个性化接口禁止公共缓存;商品公共信息按区域和语言设计缓存键。发布流程增加 CDN 刷新和结果确认,重要内容通过新 URL 版本化,避免大规模清缓存。边缘和源站之间使用回源认证,源站只允许受信节点访问。
缓存规则上线前使用脱敏测试账户验证响应隔离,检查 Cookie、Authorization、查询参数和错误码。热点内容采用预热和请求合并,源站配置限流与保护。监控命中率、回源、源站压力、内容版本和敏感响应,出现缓存越权或内容错误时立即停止规则、清理相关缓存并审计访问记录。
十一、综合知识练习
题1
反向代理和 CDN 对网站架构的主要价值是什么?
参考答案:在用户与源站之间提供统一入口、缓存、负载均衡、TLS、安全和压缩能力,减少网络距离和源站重复处理,吸收热点流量,提高响应速度和源站可用性。
题2
为什么 CDN 缓存键设计错误会造成严重安全问题?
参考答案:如果忽略用户、租户、区域或认证相关维度,不同用户的响应可能被视为同一个公共缓存对象,导致越权读取和敏感信息泄露。缓存键必须包含影响响应的必要条件,敏感响应应禁止公共缓存。
题3
缓存大规模失效时如何保护源站?
参考答案:采用请求合并、互斥回源、预热、随机过期、分层缓存、stale-while-revalidate、源站限流、降级和分批刷新,避免所有请求同时回源;同时监控回源率和源站资源。
十二、论文写作素材
论文中可以这样描述反向代理和 CDN 演化:
“针对网站用户分布广、静态资源带宽占用高和源站峰值压力大的问题,我在入口增加反向代理和 CDN,按内容公开性、变化频率、个性化程度和一致性要求分类设计缓存。静态资源使用版本化 URL 和长缓存,公共内容采用 TTL、主动刷新和预热,账户、订单和支付响应禁止公共缓存。通过完整缓存键、回源认证、源站限流和请求合并防止缓存越权、投毒和回源风暴;采用多节点健康调度和备用回源保障可用性,并监控命中率、回源率、延迟、源站压力和内容新鲜度。”
十三、今日复盘
- 反向代理和 CDN 通过边缘缓存和统一入口降低延迟、带宽和源站压力。
- 内容必须按静态、公共动态、个性化和强一致业务分类处理。
- 缓存键、TTL、刷新、回源、预热和请求合并决定缓存效果。
- CDN 不能替代源站的业务一致性、认证和安全控制。
- 要防范缓存投毒、越权、回源风暴、节点故障和源站暴露。
- 案例答题要写清内容分类、缓存策略、安全边界、故障切换和监控指标。