同样是【代理】,正向代理站在客户端这边替它出头,反向代理站在服务器前面替它挡枪——看它站在谁旁边,就知道它在干什么。
3-2 到 3-5 讲的都是【怎么把请求送到】。这一节讲的是半路上多出来的那个角色:请求不直接到服务器,而是先经过一台代理。它是现代网站里最常见的一层,也是性能与安全的主要着力点。
一、先分清方向
【代理】这个词本身不含方向。关键在于它站在谁旁边、替谁办事。
正向代理站在客户端这边:用户配置它,它替用户去访问外面的网站。网站看到的只是代理的地址,看不到后面是谁。公司统一上网出口、以及各种【换个出口访问】的工具,都属于这一类。
反向代理站在服务器前面:网站自己架设它,它替服务器接待所有来客。用户以为自己是在直接访问网站,其实中间隔了一层。CDN、云 WAF、网关,全都是反向代理的不同叫法。
二、反向代理一次解决三件事
更快:把内容缓存在离用户更近的地方,命中缓存就不用回源。
更稳:一台服务器扛不住就摆一排,由代理把请求分下去;某一台挂了,代理把流量转给其它机器。
更安全:真实服务器的地址藏在后面,攻击流量先撞在代理身上;常见的恶意请求在代理层就被拦掉了。
正因为一次解决三件事,它才成了现代网站的标配——哪怕是个小站,套一层也几乎不花钱。
三、动手 Demo:采用率与缓存账
先看采用率,数字比形容词有说服力得多。
total = 10000000
hit = 0.85
print("总请求", format(total, ","), "次,缓存命中率", hit)
print("回源", format(int(total * (1 - hit)), ","), "次")
print("省下", format(int(total * hit), ","), "次回源,相当于源头少扛 %.0f%%" % (hit * 100))
print("前 1000 个站挂 CDN 的比例:75.4%;前 100 万个站:52%")
实跑输出:
--------------------------------------------------------------------
D6 代理:正向代理替客户端出头,反向代理替服务器挡枪
--------------------------------------------------------------------
都叫代理,方向却正好相反。看清楚【它站在谁那边】,就分得清了。
比什么 正向代理 反向代理
------------------------------------------------------------------------------------
代表谁 代表客户端去访问外面 代表服务器接待外面
谁配置它 用户在浏览器里设 网站自己架在源头前面
对方看见谁 网站只看见代理的地址 用户以为在直接访问网站
典型用途 翻墙、统一出口、缓存加速 负载均衡、缓存、防护攻击
常见场合 公司统一上网出口 CDN、云 WAF、网关
为什么反向代理这么常见?因为它一次性解决了三件事:更快、更稳、更安全。
· 29.6% 的网站前面有一层反向代理
· 在这 29.6% 里,84.6% 用的是同一家
· 访问量最大的 1,000 个站,75.4% 都挂了 CDN
· 访问量最大的 100 万个站,52% 挂了 CDN
算一笔缓存账。1000 万次请求,缓存命中率 85%:
· 真正回到源头服务器的只有 1,500,000 次
· 源头少扛了 85% 的活,用户还更快拿到内容
· 这层挡在前面,攻击流量也先撞在它身上
第一组数字:29.6% 的网站前面有一层反向代理,而在这 29.6% 里,84.6% 用的是同一家。这种集中度意味着:一家出问题,波及面是【全网级别】。
流量越大的站越依赖它:访问量最大的 1,000 个站有 75.4% 挂了 CDN,前 100 万个站是 52%。这是明显的规模效应——小站靠它省钱,大站靠它活命。
第二组数字是缓存账:1000 万次请求、85% 命中率,真正回到源头服务器的只有 150 万次。这不只是省带宽,更是让源站在流量高峰时不必跟着一起喘。
四、它带来的新问题
代理不是免费的午餐。第一,它多了一跳:缓存没命中时,请求反而要比直连多走一段路。所以代理的价值取决于命中率,命中率低的时候它就是纯成本。
第二,它让排查变复杂。出问题时你得先分清:是代理的问题、还是源站的问题?缓存没刷新、回源失败、超时设置太短,都会表现成【网站打不开】。
第三,它改变了【谁能看到谁】。对源站来说,来访地址变成了代理的地址,真实用户 IP 要靠额外的头来传递。这也牵出了信任边界的问题:这些头由代理填,如果被伪造,后面的判断就全错了。
30 秒实验
- 打开开发者工具 Network 面板,点开一条请求看响应头,找找有没有
cf-cache-status、x-cache、age这类字段——有的话,说明你正在经过代理。 - 把同一个页面刷新两次,对比两次请求的耗时和响应头,看第二次是不是明显更快、缓存状态是不是变成了命中。
- 在命令行运行
nslookup www.cloudflare.com,看返回的地址有几个——多地址通常是代理或负载均衡在做分发。
常见误区
- 错误:正向代理和反向代理只是叫法不同。——纠正:方向完全相反。正向代理代表客户端去访问外面,反向代理代表服务器接待外面。判断方法是看它替谁办事,而不是看它叫什么名字。
- 错误:代理只是大站才需要的东西。——纠正:小站用它的收益往往更大。免费套餐就能拿到缓存、HTTPS 证书和基本防护,对没有专职运维的站点来说,这一层几乎等于把基础设施外包了。
- 错误:套了代理,源站就绝对安全了。——纠正:它只是把你藏起来,不是把你锁起来。源站地址一旦被找到,绕过代理直接打一样能打。所以正确做法是让源站只接受来自代理的流量,而不是指望外面找不到它。
- 错误:把用户真实 IP 交给源站的头是可信任的。——纠正:要分来源。这些头是由代理填写的,只有来自你自己信任的那一层代理时才可信;直连进来的请求也能带上同样的头,照着它做权限判断就会被绕过。
自测三问(点开对答案)
1. 怎么一眼分清正向代理和反向代理? —— **看它替谁办事**。正向代理由用户配置、替用户去访问外面,网站只看见代理的地址;反向代理由网站自己架设、替服务器接待来客,用户以为在直连。**一句话:一个替客户端出头,一个替服务器挡枪。** 2. 反向代理一次解决了哪三件事? —— **更快**(就近缓存)、**更稳**(分发与容错)、**更安全**(隐藏源站、拦截攻击)。三件事同时成立,所以它才会成为现代网站的标配。 3. 为什么说代理的价值取决于命中率? —— 因为**它多了一跳**。缓存命中时省掉整段回源,收益很大;没命中时请求反而要多走一段路,**这时它就是纯成本**。所以配置代理的核心,是让缓存尽量命中——**而不是简单地【加上一层就完事】**。- ☐ 下一节(3-7 在浏览器与Web服务器之间进行加密:SSL)
相关笔记
- 连接域名与IP地址 —— 上一节:请求在路上怎么找到目的地
- 如何访问国外的Web网站 —— 访问远方的站点,中间要经过很多层
- 用于构建网络的设备 —— 网络里的各种中间设备
- Web服务器的外观与内部结构 —— 源站那一侧长什么样
- 🕸️ Web技术原理 · 索引