HTTP代理服务器与Web缓存
概念引入
想象广州飞翔科技的公司结构:图妹(产品经理)想订外卖,但她不能直接接触所有商家——前台云吞(社群运营)帮忙统一收单、筛选商家、甚至把常点的"老广烧腊"提前备好。这就是代理服务器(Proxy Server)的角色:介于客户端和源服务器之间的"中间人",帮双方跑腿、把关、加速。
而 Web 缓存则像公司茶水间的公共零食柜——有人把饼干放那儿,下次谁饿了直接拿,不用再去楼下便利店。
核心内容
代理服务器概念
代理服务器是位于客户端和源服务器之间的中间服务器,接收客户端请求后转发给目标服务器,再将响应返回给客户端。它既可以是"客户端的代言人",也可以是"服务器的守门员"。
飞翔公司的网络架构中,代理服务器就像凌叔(运维)在机房门口设的闸机——所有进出流量都要过一遍,既能记录日志,也能拦截风险。
正向代理:客户端的"代言人"
正向代理(Forward Proxy)靠近客户端,代表客户端向服务器发起请求。常见用途:
- 访问控制:飞翔公司内网只允许通过代理访问外网,凌叔可以精确控制谁能访问什么
- 匿名访问:隐藏客户端真实 IP
- 内容过滤:拦截娱乐网站,保证航仔(后端)和风速(算法)专心写代码
场景:飞翔公司技术部在局域网内开发,空少(前端)需要引用外网的 CDN 资源。所有请求先发到公司正向代理,代理判断"这个 CDN 域名在白名单里",才允许访问。
反向代理:服务器的"守门员"
反向代理(Reverse Proxy)靠近服务器,代表服务器接收客户端请求。常见用途:
- 负载均衡:将请求分发到多台后端服务器
- 缓存加速:把热门响应存起来,减少后端压力
- SSL 终端:统一处理 HTTPS 加密解密
- 安全防护:隐藏真实服务器 IP,防御 DDoS
飞翔公司官网架构:
翼王(架构师)设计的官网架构中,Nginx 作为反向代理,把图片/CSS/JS 缓存到边缘节点,API 请求转发给航仔的后端集群。
Web 缓存工作原理
Web 缓存是代理服务器或浏览器本地存储的响应副本。当再次请求相同资源时,如果缓存有效,就直接返回副本,不用再去源服务器。
缓存命中 vs 缓存未命中
- 缓存命中(Cache Hit):缓存里有且有效,直接返回 → 快如闪电
- 缓存未命中(Cache Miss):缓存里没有或已过期,去源服务器取 → 慢如蜗牛
代理缓存的优势
| 优势 | 说明 | 飞翔公司场景 |
|---|---|---|
| 减少时延 | 缓存离用户更近 | CDN 节点让全国用户快速访问官网 |
| 节省带宽 | 重复请求不走源站 | 波比(活动运营)的大促页面被缓存,省流量费 |
| 负载均衡 | 分散请求压力 | 雁姐(用户运营)推送通知时,缓存扛住高峰 |
| 可用性 | 源站故障时缓存仍可服务 | 凌叔升级服务器时,CDN 继续提供静态页面 |
透明代理 vs 非透明代理
- 透明代理(Transparent Proxy):客户端不知道自己走了代理,无需配置。就像公司走廊里的自动感应门——你正常走,它默默帮你开。
- 非透明代理(Non-transparent Proxy):客户端必须显式配置代理地址和端口。就像去前台登记才能借用会议室。
飞翔公司内网采用透明代理,员工电脑无需任何设置,所有 80/443 端口流量自动被重定向到代理网关。
浏览器缓存 vs 代理缓存
| 维度 | 浏览器缓存 | 代理缓存 |
|---|---|---|
| 存储位置 | 用户本地磁盘 | 代理服务器/CDN 节点 |
| 控制者 | 用户/开发者 | 运维/CDN 服务商 |
| 共享性 | 仅当前用户 | 所有用户共享 |
| 典型头部 | Cache-Control, Expires | Age, X-Cache |
| 清除难度 | 用户可清浏览器缓存 | 需联系运维或 CDN 刷新 |
飞翔公司使用 CDN 加速官网
飞翔科技的官网 www.feixiang.net 接入了 CDN(内容分发网络,一种大规模分布式反向代理缓存)。鸣哥(内容运营)上传了一篇新文章:
- 首次访问:北京用户请求 → CDN 节点未命中 → 回源到广州服务器 → 缓存到北京的 CDN 节点
- 再次访问:北京用户请求 → CDN 节点命中 → 直接返回,延迟从 80ms 降到 10ms
- 内容更新:鸣哥刷新 CDN 缓存,全国节点同步失效并重新拉取
本篇小结
- 代理服务器:位于客户端和源服务器之间的中间服务器,可转发、过滤、缓存请求
- 正向代理:靠近客户端,代表客户端访问外网,用于访问控制和匿名化
- 反向代理:靠近服务器,用于负载均衡、缓存加速、SSL 终端和安全防护
- Web 缓存:存储响应副本,命中时直接返回,减少时延和带宽消耗
- Cache Hit:缓存有效,直接返回;Cache Miss:缓存无效,回源获取
- 透明代理:客户端无感知;非透明代理:需客户端显式配置
- CDN:大规模分布式反向代理缓存,让内容离用户更近
动手实践
温馨提示: 以下实践示例中涉及的域名(如
www.feixiang.net)、公司场景和接口均为虚构数据,仅用于演示协议原理,实际执行时可能不会产生文档中描述的效果。建议将命令中的域名替换为你自己可访问的真实地址进行练习。
实践:用 curl 观察代理缓存头部
# 查看响应中的缓存相关头部
curl -I https://www.feixiang.net
# 关注这些头部:
# Cache-Control: max-age=3600
# Age: 120 (已在缓存中停留120秒)
# X-Cache: HIT (CDN缓存命中)
# X-Cache: MISS (CDN缓存未命中)
实践:用 curl 测试通过正向代理访问
# 配置curl使用正向代理
curl -x http://proxy.feixiang.net:8080 http://example.com
# 带认证的正向代理
curl -x http://user:pass@proxy.feixiang.net:8080 http://example.com
实践:用 Chrome DevTools 观察缓存状态
- 打开 DevTools → Network 面板
- 访问
www.feixiang.net,观察Size列:disk cache:从本地磁盘缓存读取memory cache:从内存缓存读取- 具体数字:从网络下载
- 勾选
Disable cache对比加载速度差异
实践:思考题
- 飞翔公司内网部署透明代理时,凌叔如何确保 HTTPS 流量也能被审计而不破坏安全性?
- 反向代理缓存了航仔的 API 响应,但 API 数据是动态的(如用户余额),如何避免缓存错误数据?
- CDN 节点遍布全国,鸣哥更新了一篇紧急公告,如何确保所有用户立即看到最新内容?