缓存与现代 Web 架构

HTTP 缓存与 304 协商

如果页面每次刷新都重新下载相同的 CSS、图片和字体,用户会觉得慢,服务器也会承担不必要的流量。HTTP 因此提供了一套缓存协商机制,让浏览器可以判断“本地缓存还能不能继续用”。

第一次取得资源与 ETag,后续条件请求得到 304 并复用缓存

常见流程有两类:

  1. 强缓存:直接使用本地资源

    服务器可以通过响应头设置有效期,例如:

    Cache-Control: max-age=600
    

    在这 600 秒内,浏览器不会向服务器发起新请求,而是直接读取本地缓存。

  2. 协商缓存:问过服务器再决定是否重新下载

    如果资源缓存已经过期,浏览器可以把资源的标识带给服务器,让服务器判断内容是否变化。

    第一次请求时,服务器通常会返回资源指纹,例如:

    ETag: "abc123hash"
    

    缓存过期后,浏览器再次请求时会带上:

    If-None-Match: "abc123hash"
    

    如果资源确实没有变化,服务器只需返回:

    HTTP/1.1 304 Not Modified
    

    并且不再携带响应体。浏览器收到 304 后,就会继续复用本地已有缓存。这样既保证了内容正确,也节省了网络带宽。

现代 Web 部署基础设施

在真实生产环境中,用户访问的网站往往不是单台服务器,而是一组经过分层处理的基础设施。请求通常会依次经过入口、代理、负载均衡、后端服务以及数据存储等组件。

入口将请求分配到应用实例,应用共享数据存储

常见组件包括:

  • 反向代理(Reverse Proxy,如 Nginx):站在应用服务前方,统一对外暴露 80 / 443 端口,负责 TLS 加密卸载、请求路由和初步防护。
  • 负载均衡器(Load Balancer):把大量并发请求分配给多个应用服务器实例,避免单台机器被压垮。
  • CDN(内容分发网络):在全球边缘节点缓存图片、视频、脚本等静态资源,让用户从离自己更近的节点获取内容。
  • WAF(Web 应用防火墙):识别并拦截 SQL 注入、XSS 等常见 Web 攻击,为应用提供一层安全过滤。

真实文档网站的一次正常访问包含文档、样式与图片资源