与HTTP协作的web服务器
代理
代理位于客户端和服务器之间,代表客户端转发请求,再把服务器的响应转回给客户端。对服务器来说,它看到的请求方是代理,不是真实客户端。
客户端 → 代理 → 服务器
客户端 ← 代理 ← 服务器
缓存代理(正向代理)
代理把服务器返回的响应缓存下来。下次有相同请求时,直接从缓存返回,不再去源服务器取。
- 减少源服务器压力
- 加快响应速度
- 典型场景:公司内网统一出口代理
透明代理
对客户端透明,客户端不知道代理的存在,请求被网络设备自动拦截转发。内容不做修改,只做转发。
- 典型场景:运营商的透明缓存节点
梯子(正向代理)
梯子是主动配置的正向代理,不是透明代理——你需要手动在系统或软件里设置代理地址,客户端完全知道它的存在。
你的电脑 → 梯子服务器(境外)→ Google/YouTube
防火长城(GFW)封锁的是你直接访问境外 IP 的流量。梯子的做法是:把请求先发给一台没被封的境外服务器,由它代替你去访问目标网站,再把结果转回来。GFW 看到的只是你和梯子服务器之间的加密流量,看不到你在访问什么。
网关
网关代表服务器,客户端把网关当作服务器来通信,实际内容由网关转发给后端真实服务器处理。
客户端 → 网关 → 后端服务器
CDN 举例:
访问百度,百度的源服务器在北京,距离远延迟高。百度在全国各地部署了 CDN 节点,离你最近的那个节点就是网关。你的请求打到这个节点,节点要么直接返回缓存内容,要么回源去北京取。对你来说,你只和这个近的节点通信,感知不到北京的源服务器。
网关还可以做协议转换,比如客户端用 HTTP,后端用数据库协议,网关负责中间转换。
隧道
隧道在客户端和服务器之间建立一条加密通信通路,隧道本身不解析 HTTP 内容,只负责透传。
- 目的:保证通信安全
- 典型场景:HTTPS 的 SSL/TLS 就是一种隧道;VPN 也是隧道
- 隧道在通信双方断开连接时消失
缓存
什么是缓存
服务器或代理把资源的副本保存在本地,后续请求直接用副本响应,不再去源服务器取。
第一次:客户端 → 代理(无缓存)→ 源服务器 → 代理(存缓存)→ 客户端
第二次:客户端 → 代理(有缓存,直接返回)
缓存的有效期限
缓存不能永久有效,过期后需要重新向源服务器确认。
- 强缓存:响应头带
Cache-Control: max-age=秒数或Expires: 日期,在有效期内直接用缓存,不发请求 - 协商缓存:缓存过期后,带上
If-Modified-Since或If-None-Match去服务器问”资源有没有变”- 没变 → 服务器返回
304 Not Modified,继续用缓存 - 变了 → 服务器返回新资源
200 OK
- 没变 → 服务器返回
| 响应头字段 | 作用 |
|---|---|
Cache-Control: max-age=3600 | 缓存有效期 3600 秒 |
Cache-Control: no-cache | 每次都要去服务器确认 |
Cache-Control: no-store | 不允许缓存 |
Expires | 指定过期的绝对时间(旧方式,优先级低于 max-age) |
ETag | 资源的唯一标识,用于协商缓存 |
Last-Modified | 资源最后修改时间,用于协商缓存 |
客户端缓存(浏览器缓存)
浏览器本地也会缓存资源,流程和代理缓存一样,只是存在本地磁盘/内存里。
- 强缓存命中:直接从本地读,状态栏显示
200 (from disk cache)或200 (from memory cache) - 协商缓存命中:发请求,服务器返回
304,浏览器用本地副本 - 都没命中:正常请求,服务器返回
200和新资源
如果你正在跟随梳理, 返回 MOC←