想象你走进一家五星级酒店。你不会绕到后厨找主厨点菜,也不会跑到洗衣房催床单——你只会走向大堂前台,报上姓名,递出请求。前台小姐接过需求,转身安排客房、行李、餐饮,一切井井有条。这家酒店所有对外服务的门面只有一个,就是前台。而在互联网世界里,反向代理就是那个前台:每个用户的请求先到达它,由它转发给藏在后台的服务器群。它兼任接待员、调度员、保安、行李员和信息台——既要扛住百万客流,又要保护内部员工不被骚扰。学会反向代理,你就读懂了现代网站高并发、高可用架构的核心秘密。

岗位关联

反向代理是 Web 架构的枢纽角色,掌握它能让你快速理解负载均衡、安全防护与灰度发布等生产级技能,是 AI 与后端工程师进阶的必修课。

目录
  1. 可视化演示
  2. 前台角色定位
  3. 四层七层差异
  4. Nginx核心功能
  5. SSL卸载安全
  6. 健康检查机制
  7. 会话保持策略
  8. 缓存加速原理
  9. 工程应用价值
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

交互对比四层(L4)与七层(L7)反向代理的请求转发过程,展示负载均衡、SSL卸载、健康检查与后端服务器选择策略。

本节配有交互动效(进入视口后自动加载,约 3KB)。

反向代理 (Reverse Proxy) 客户端请求到达代理服务器 代理转发至健康后端节点 健康后端正常响应 故障后端被剔除 L4: TCP转发 | L7: HTTP解析+SSL卸载+路由 L7支持基于URL/Header的智能路由

前台角色定位

想象你入住一家五星级酒店。你不会拎着行李冲进后厨找主厨,也不会跑去洗衣房催床单。你只会站在大堂前台,报上姓名,递出身份证。前台小姐接过需求,转身安排一切。这家酒店所有对外服务的门面只有一个——前台。而在网站架构里,反向代理就是这个前台。它站在所有用户请求与后端服务器之间,成为唯一的“入口接待”。

反向代理(Reverse Proxy)接收客户端的请求,再转发给内部服务器,并把服务器的响应原路送回。之所以叫“反向”,是因为它与正向代理的立场完全相反。正向代理代表客户端,替用户访问外部世界,比如你在浏览器里配置的VPN代理;反向代理代表服务器端,替后端接待外部访客。用户能感知到自己在用正向代理,却感知不到背后有一个反向代理——它把多台服务器包装成一个“虚拟前台”。

一个典型的请求转发路径是:客户端 → 反向代理 → 后端服务器 → 反向代理 → 客户端。代理层承担了统一入口、请求分发和响应回传。站在这个位置,它能看到所有流量,因此可以做限流、鉴权、安全过滤;它挡在后端前面,因此可以隐藏后端真实IP,起到隔离保护作用。

请求总延迟由三段构成:

前台小姐每接待一位客人,也要先听清需求、确认房态、联系对应部门。客人等待的时间等于走进大堂的时间、前台沟通的时间、内部响应的时间之和。一个好前台会压缩自己那一部分,并让内部响应更快。反向代理做的正是这两件事:压缩代理自身的开销,并让后端服务器更快、更稳地响应。

Ltotal=Lclient+Lproxy+Lserver\displaystyle L_{total} = L_{client} + L_{proxy} + L_{server}
一次请求的整体耗时,等于“客户端到代理”、“代理自身处理”、“代理到后端”三段开销之和。
  1. L_total一次请求从发出到收到响应的总耗时,是用户体感的直接来源。
    LtotalL_{total}
  2. L_client客户端与代理之间的网络往返时间,通常由用户网络质量决定。
    LclientL_{client}
  3. L_proxy代理做转发、校验、分发处理的耗时,优质代理应让这一项趋近于零。
    LproxyL_{proxy}
  4. L_server后端真正执行业务逻辑的耗时,代理无法消除它,但能通过缓存和调度优化它。
    LserverL_{server}

四层七层差异

同样是前台,有两种接待风格。一种只看一眼你的房卡号就指个方向让你自己过去,速度快但不知道你要干什么;另一种会认真听你说完诉求,再帮你联系具体部门,服务到位但稍慢。这两种风格,对应着网络世界里四层代理与七层代理的分野。

网络协议从上到下分七层。四层代理工作在传输层,只解析源IP、目标IP、源端口、目标端口,完全不关心包里的内容;七层代理工作在应用层,能读懂URL、请求头、Cookie和正文。Nginx是典型的七层代理,而LVS、HAProxy则常作为四层代理使用。选四层还是七层,本质上是在“转发速度”与“理解深度”之间做权衡。

四层代理的数据转发基于四元组。它像一个快递中转站,只看信封上的地址、不拆信,因此吞吐高、延迟低;但它无法根据请求内容做出智能路由,比如把图片请求发给图片服务器、把API请求发给应用服务器。七层代理则能拆开信封读内容,按路径、域名甚至Header分流,还能做更细粒度的限流和改写,代价是每一层协议解析都消耗CPU。

想象酒店同时设了两道前台:快速通道只看房卡号就放行,VIP接待室则详细记录需求再分配管家。着急的客人走快速通道,不赶时间的走VIP通道——聪明的酒店让两种前台共存,正如成熟的架构会让四层和七层代理各司其职。

{L4:target=f(ipdst,portdst)L7:target=g(uri,header,body)\displaystyle \begin{cases} L4: target = f(ip_{dst}, port_{dst}) \\ L7: target = g(uri, header, body) \end{cases}
四层代理用“目标IP+端口”做决策,七层代理用“URI+头部+正文”做决策。前者快而粗,后者慢而细。
  1. target代理最终选择转发到哪台后端服务器,是整个决策的输出。
    targettarget
  2. f(ip, port)四层代理只看信封上的目标IP和端口,不拆信,所以速度快。
    f(ipdst,portdst)f(ip_{dst}, port_{dst})
  3. g(uri, header, body)七层代理拆开信读路径、头部和正文,能听懂“人话”做智能路由。
    g(uri,header,body)g(uri, header, body)
  4. 取舍L4快而粗,L7慢而细,生产环境常让两者配合:L4扛流量,L7做路由。
    {L4:快L7:懂\begin{cases} L4: 快 \\ L7: 懂 \end{cases}

Nginx核心功能

前台小姐桌上有一本“排班手册”,上面记录着每位服务员的忙闲程度和擅长领域。新客人进门,她快速瞄一眼手册,把客人分配给此刻最合适的人。Nginx的请求路由和负载均衡,就是这本排班手册的数字化版本。

Nginx作为最流行的七层反向代理,核心能力是“把请求分发给多个后端服务器”。它通过upstream块定义一组后端,再通过负载均衡策略决定下一个请求交给谁。最简单的策略是加权轮询:每台服务器有一个权重数字,权重越高被选中的次数越多。这就像排班手册里标注“老员工每小时能接待3位客人,新员工只能接待1位”。

除了加权轮询,Nginx还支持最少连接数策略,把请求分给当前活跃连接最少的服务器,避免某台机器被压垮;还支持ip_hash策略,让同一IP固定访问同一后端。生产环境通常按机器配置设定权重:CPU强、内存大的机器权重设高一些,让资源利用率最大化。请求路由则可以根据URL前缀、域名、Header将流量导向不同的后端组,实现“图片走图床、接口走应用服务”的拆分。

排班手册的核心智慧在于“按能力排班”而不是“轮流排班”。加权轮询让3倍资源的服务器承担3倍流量,这是一种朴素的资源匹配思想。Nginx把前台的经验固化成算法,任何时刻都能快速决策,而且永远不知疲倦。

Pi=wi∑j=1Nwj\displaystyle P_i = \frac{w_i}{\displaystyle\sum_{j=1}^{N} w_j}
加权轮询的本质:某台服务器被选中的概率 = 它的权重 ÷ 所有存活服务器权重之和。
  1. N参与分发的后端服务器总台数。
    NN
  2. w_i第i台服务器的权重,权重越大代表承接能力越强。
    wiw_i
  3. Σw_j所有存活服务器权重之和,分母越大单台占比越小。
    ∑j=1Nwj\sum_{j=1}^{N} w_j
  4. P_i第i台服务器被选中的概率,权重占比越高,请求分到它头上的比例越大。
    PiP_i

SSL卸载安全

入住酒店时,行李员会主动帮你接过沉重的箱子,你只需要轻装走进房间。SSL/TLS加密就是那个沉重箱子——加解密运算非常消耗CPU。反向代理的SSL卸载功能,就是前台帮你接过箱子,把最沉重的加密解密工作承担下来,让后端服务器专注于业务逻辑。

正常HTTPS通信需要经过完整的TLS握手:协商加密套件、交换证书、生成会话密钥。这个过程涉及非对称加密和证书链校验,开销很大。如果每台后端服务器都独立做一遍,性能会大打折扣。反向代理可以在代理层统一终止SSL——解密后再把普通HTTP请求转发给内网后端。后端之间走内网明文传输,既省掉了加解密成本,又因为流量不出内网而相对安全。

SSL卸载的另一个好处是证书统一管理。多个域名、多台服务器不必各自配置证书,只需在代理处统一部署。结合自动化证书工具,甚至可以做到证书自动续期。代价是:代理与后端之间的链路若被攻破,明文流量会暴露。因此成熟方案会在代理到后端之间再加一层网络隔离或隧道加密。

行李员的存在让客人入住体验大幅提升,客人甚至感觉不到自己省了多少力气。SSL卸载也是如此——用户感知不到加密细节,后端服务器却实实在在减轻了负担。前台扛下了最重的箱子,后面的人才能跑得更快。

TLS_cost=2×RTT+Ccrypto\displaystyle TLS\_cost = 2 \times RTT + C_{crypto}
一次TLS握手的开销 = 两次网络往返 + 加密计算成本。SSL卸载就是把这笔账从后端挪到代理头上。
  1. TLS_cost建立一条HTTPS安全连接的总开销。
    TLS_costTLS\_cost
  2. RTT网络往返时间,TLS握手通常需要两次往返来交换证书和确认密钥。
    RTTRTT
  3. C_crypto非对称加密与证书校验消耗的CPU计算成本,是后端的沉重负担。
    CcryptoC_{crypto}
  4. 卸载收益后端省去这笔开销,CPU资源全部释放给业务处理。
    Ccrypto→0C_{crypto} \rightarrow 0

健康检查机制

前台小姐有一本“房间状态簿”,每隔几分钟就给客房部打电话确认:“301退房了吗?502需要清洁吗?”一旦某间房连续多次无人接听,她就果断在状态簿上标注“暂不可用”,绝不把新客人安排进去。健康检查,正是代理对后端服务器的这套“电话确认”。

后端服务器可能因为过载、崩溃、网络抖动而暂时无法服务。如果代理还把请求转发过去,用户就会得到一连串错误。健康检查机制让代理动态感知后端的“生死”。Nginx中常见的做法有两种:主动检查和被动检查。主动检查是代理定期向后端发送探测请求,比如请求一个健康检查路径;被动检查是代理不主动探测,而是根据真实请求的失败次数判定——比如某台服务器连续3次返回5xx错误,就把它标记为失败。

被标记为“不可用”的后端会从转发池中摘除,同时保留恢复探测:经过一段时间或连续成功M次后,重新将其加入转发列表。这种“摘除—恢复”的闭环,让整个系统具备了自愈能力。主动检查能尽早发现问题但会占用少量带宽,被动检查零额外流量但发现问题时已积累了几个失败请求,两者常配合使用。

前台绝不让客人住进一间坏掉的房间,哪怕其他房间因此多等几分钟。这份“宁可错杀,不可错住”的谨慎,正是健康检查的精髓。它让前台不断更新对酒店内部状态的认知,永远把客人安排在最靠谱的房间。

status(t)={unhealthy,F(t)≥Nhealthy,F(t)<N\displaystyle status(t) = \begin{cases} unhealthy, & F(t) \ge N \\ healthy, & F(t) < N \end{cases}
一台服务器在时刻t的状态由“连续失败次数是否达到阈值”决定——达到阈值就下线摘除,否则保持可用。
  1. F(t)截至时刻t的连续失败次数,是故障累积计数器。
    F(t)F(t)
  2. N失败阈值,连续失败达到N次即触发下线。
    NN
  3. unhealthy该后端被从负载均衡列表中临时摘除,不再接收新请求。
    unhealthyunhealthy
  4. healthy连续成功恢复后被重新加回列表,继续承担流量。
    healthyhealthy

会话保持策略

第一次入住的客人跟前台聊了很久,交代了枕头偏好、叫醒时间、忌口清单。前台会记在心里,并尽量让同一位管家全程服务。如果下次客人回来换了管家,又得重新交代一遍,双方都累。会话保持,就是让“同一个客人”始终找到“同一位管家”。

很多Web应用需要用户在多次请求间保持登录状态。虽然可以用共享Session或Token实现,但最省事的办法是让同一用户的请求始终落到同一台后端服务器。这样即使后端本地保存了Session状态,也不会因为跳到别的机器而丢失。这在有状态服务中尤其重要。

两种最常见的实现方式:IP哈希和Cookie粘滞。IP哈希对客户端IP做哈希后取模,算出固定后端编号——同一个IP永远分到同一台服务器,实现简单但存在负载不均风险。Cookie粘滞则由代理在响应中植入一个带后端标识的Cookie,后续请求带着这个Cookie,代理直接引导到对应后端。更高级的一致性哈希能在后端数量变化时只迁移少量会话,适合缓存型架构。

前台记不住三千位客人的喜好,但通过“房卡颜色”这类小技巧就能快速识别常客、找到对应管家。IP哈希和Cookie粘滞都是这个思路——用一个简单的标识符,换取一段稳定的对应关系。虽然牺牲了一点均衡性,却换来了用户体验的稳定。

idx=hash(ipclient) mod N\displaystyle idx = hash(ip_{client}) \bmod N
IP哈希的核心:对客户端IP做散列,再对可用后端数量取模,得到0到N-1之间的稳定编号。
  1. ip_client客户端IP地址,作为哈希函数的输入。
    ipclientip_{client}
  2. hash()散列函数,把IP映射为一个整数。
    hash(ipclient)hash(ip_{client})
  3. N当前可用后端数量,取模运算保证结果不越界。
    NN
  4. idx计算出的后端序号,同一个IP稳定得到同一个序号,从而绑定同一台服务器。
    idxidx

缓存加速原理

客人最常问的问题前三名永远是“WiFi密码多少”“早餐几点开始”“健身房在哪”。前台把这些答案写在速查卡上,两秒就能回答,完全不用每次跑去问客房部。缓存加速,就是给高频问题准备速查卡。

后端服务器处理一个动态请求往往要查询数据库、执行业务逻辑,耗时可能几十到几百毫秒。但很多内容其实是相对固定的:图片、CSS、JS文件、热门文章的HTML页面。反向代理可以在这一层把内容缓存下来,当相同请求再次到达时,直接返回缓存结果,完全不打扰后端。

Nginx的缓存基于URI和请求头生成缓存键,配合Cache-Control、Expires等响应头判断内容可缓存性。缓存命中率是衡量缓存效果的核心指标:命中率越高,说明被“拦截”的重复请求越多。同时还要考虑失效策略:缓存不能永久有效,必须配合过期时间、版本号主动失效,否则用户会看到陈旧内容。

前台不可能把客人的每个问题都做成速查卡,只挑最高频、最稳定的那几条。缓存也一样:只缓存重复出现、内容变化慢的资源,才能在命中率和数据新鲜度之间找到平衡。好的前台懂得什么该记、什么不该记。

h=HH+M\displaystyle h = \frac{H}{H + M}
缓存命中率 = 命中次数 ÷ 总请求次数。越接近1,说明越多的请求被“速查卡”直接回答。
  1. H命中次数,代理直接用缓存回答请求。
    HH
  2. M未命中次数,代理只好转发给后端获取新鲜数据。
    MM
  3. H + M总请求数,命中与未命中的全集。
    H+MH + M
  4. h命中率,越接近1说明缓存越有效、后端压力越小。
    hh

工程应用价值

酒店翻新了顶楼套房,不敢直接开放给所有客人,先让几位VIP试住一晚,收集反馈后再全面开放。同时,所有访客进酒店前都要先经过大堂前台,不明身份的陌生人连电梯都摸不到。这两个场景,对应反向代理在灰度发布与安全隔离上的工程价值。

安全隔离方面:反向代理作为唯一入口,屏蔽了后端服务器的真实IP和端口。外部扫描只能看到代理,很难直接触达后端。代理还可以做IP黑名单、请求频率限制、SQL注入与XSS的基本过滤,相当于前台保安的角色。灰度发布方面:代理可以在新老两套后端之间按比例分配流量,比如先切5%真实流量到新版本,观察错误率和延迟,确认稳定后逐步扩大到10%、50%、100%。

这种渐进式发布显著降低了发布风险。如果没有代理层,要让1%的用户访问新版本只能靠修改DNS或让前端做随机分流,既笨拙又不可控。有了代理层,只需调整一个权重参数,还能配合监控系统在出错时一键切回旧版本。可以说,反向代理是现代微服务架构中“进可攻、退可守”的战略要地。

VIP试住、全面开放、随时叫停——灰度发布的每一步都透着工程谨慎。而那道只有前台才能打开的门,让酒店内部布局始终不被外人看清。反向代理把这两件事统一起来:它既是最灵活的流量开关,也是最坚固的安全屏障。

r=VnewVnew+Vold\displaystyle r = \frac{V_{new}}{V_{new} + V_{old}}
灰度流量占比 = 新版本接收的请求量 ÷ 总请求量。r从0%平滑过渡到100%,就是一次完整的灰度发布。
  1. V_new分流到新版本的请求量,从0开始逐步增加。
    VnewV_{new}
  2. V_old分流到旧版本的请求量,随灰度推进逐步减少。
    VoldV_{old}
  3. r新版本流量占比,从0%平滑过渡到100%。
    rr
  4. 回滚发现问题时把r急速降回0,实现一键回滚。
    r→0r \rightarrow 0

AI 应用场景

电商大促:前台如何扛住百万客流

阶段:架构设计与性能优化

解决的问题:传统方式把后端服务器直接暴露给公网,一旦访问量暴涨,单点机器很快被打满,而且无法动态伸缩。AI电商系统借助Nginx反向代理做七层入口,统一承接所有流量,用加权轮询把请求均匀分摊到后端集群,用健康检查自动摘除过载节点,用缓存拦截热门商品页,后端压力可下降60%以上。

具体案例:某电商平台在促销前把后端扩容到20台,Nginx按机器规格设置权重,同时开启静态资源缓存,缓存命中率达到85%,大促期间后端CPU峰值从95%降到40%,用户下单成功率保持在99.9%。

微服务网关:保安与门禁

阶段:安全防护与合规治理

解决的问题:微服务拆分后后端接口散落各处,直接暴露容易被攻击。反向代理作为统一入口,承担TLS卸载、IP白名单、限流、鉴权等职责,后端服务全部藏在内网,外部无法触达。代理层还能统一管理SSL证书,避免每台后端各自暴露。

具体案例:某金融科技公司将所有微服务放在Kong网关之后,外部只能访问80/443端口,内部通过服务发现转发。第三方渗透测试发现,扫描器无法发现任何一个后端服务的真实IP,全部流量被网关拦截并记录日志,顺利通过等保合规审查。

AI模型灰度发布:先让5%流量试住新套房

阶段:MLOps模型发布管理

解决的问题:AI模型升级时最怕新模型效果不如旧模型。借助反向代理的灰度分流能力,把5%的线上推理请求引流到新模型服务,其余95%仍走旧模型,通过监控CTR、延迟等指标对比两者表现,确认无损后再逐步放大流量。

具体案例:某推荐系统的新模型上线时,运维在代理层配置权重“新模型5%、旧模型95%”,观察两小时后点击率提升2%、延迟无恶化,再把比例调到50%、100%。全程无需重启服务,发现异常可一键切回。

Python 演示

python86 行
"""简易反向代理模拟器:加权轮询 + 健康检查 + 缓存加速"""import hashlibimport random  class Backend:    """模拟一台后端服务器"""     def __init__(self, name, weight=1):        self.name = name        self.weight = weight        self.alive = True        self.fail_count = 0     def handle(self, request):        if not self.alive:            raise ConnectionError(f"{self.name} 已下线")        return f"{self.name} 处理了请求 {request}"  class ReverseProxy:    """前台:反向代理核心逻辑"""     def __init__(self, backends):        self.backends = backends     def weighted_round_robin(self):        """加权轮询:按权重随机选择一个存活后端"""        total = sum(b.weight for b in self.backends if b.alive)        r = random.uniform(0, total)        upto = 0        for b in self.backends:            if not b.alive:                continue            upto += b.weight            if r <= upto:                return b        return None     def ip_hash(self, client_ip):        """IP 哈希:同一 IP 固定打到同一后端"""        idx = int(hashlib.md5(client_ip.encode()).hexdigest(), 16) % len(self.backends)        return self.backends[idx]     def health_check(self, failure_threshold=3):        """主动健康检查:模拟探测并摘除故障节点"""        for b in self.backends:            if random.random() < 0.15:                b.fail_count += 1                if b.fail_count >= failure_threshold:                    b.alive = False            else:                b.fail_count = 0                b.alive = True     def run(self, requests):        """主流程:处理一批请求"""        results = []        cache = {}        for req in requests:            if req in cache:                results.append(f"[缓存命中] {cache[req]}")                continue            self.health_check()            backend = self.weighted_round_robin()            if backend is None:                results.append("[错误] 无可用后端")                continue            try:                resp = backend.handle(req)                cache[req] = resp                results.append(resp)            except ConnectionError as e:                results.append(str(e))        return results  if __name__ == "__main__":    backends = [        Backend("服务器A", weight=3),        Backend("服务器B", weight=2),        Backend("服务器C", weight=1),    ]    proxy = ReverseProxy(backends)    for line in proxy.run([f"请求{i}" for i in range(10)]):        print(line)
目的:用Python模拟一个极简反向代理,演示加权轮询调度、健康检查摘除故障节点、缓存加速三个核心机制。
  1. total = sum(b.weight for b in self.backends if b.alive)计算所有存活后端的权重总和,作为随机区间的上界。
  2. r = random.uniform(0, total)生成0到总权重之间的随机数,相当于掷一次“权重骰子”。
  3. upto += b.weight不断累加权重形成区间,骰子落在哪个区间就去哪台后端。
  4. if b.fail_count >= failure_threshold连续失败达到阈值,判定该后端下线。
  5. b.alive = False把故障后端从候选池中摘除,新请求不再发给它。
  6. if req in cache缓存命中判定,命中就直接返回,不穿透到后端。
  7. self.health_check()每次处理请求前先做一轮健康探测,保证只把请求发给活着的后端。
  8. Backend("服务器A", weight=3)用权重表示服务器性能差异,权重越大干活越多。

常见误区

误区反向代理也是代理,跟VPN那种代理差不多吧?反正都是中间人转发,换个名字而已。

正解方向完全不同。正向代理代表“客户端”去访问外部网络,客户端知道自己在使用代理(比如浏览器里配置代理服务器);反向代理代表“服务器端”接待外部访客,客户端完全感知不到它的存在,还以为是自己在直接跟最终服务器对话。一个替用户出门办事,一个替商家看门迎客,立场正好相反。

为何常见:两者都叫“代理”且都在做转发,初学者很容易把“谁代表谁”这个方向搞混。

误区负载均衡不就是把请求随机丢给不同服务器吗,跟抽奖一样,轮到谁是谁。

正解真正的负载均衡要考虑权重、当前连接数和后端健康状态。加权轮询让性能强的机器多干活;最少连接数让空闲机器优先接客;如果某台后端已经宕机,再“随机”分给它就是灾难。均衡不是抽奖,而是带信息的调度,每一台服务器的状态都在动态参与决策。

为何常见:名字里有“均衡”二字,容易理解成平均分,而平均分最朴素的理解就是随机或轮流。

误区代理把HTTPS解密成HTTP转发,数据在网络上裸奔,这也太危险了吧!

正解解密后的明文只在内网传输,内网本身有网络隔离和防火墙保护,外部攻击者无法截获。而且SSL卸载换来的是巨大的性能收益:后端不必再为每个连接做昂贵的非对称加密计算。真正需要担心的是代理节点自身的安全,所以要对代理服务器做加固和权限管控。

为何常见:大家习惯性认为“加密=安全,明文=危险”,忽略了网络环境本身的层次差异——内网和外网的信任级别完全不同。

误区只要做了会话保持,请求全打在一台服务器上,其他服务器都闲着,负载均衡还有什么意义?

正解会话保持只是让“同一个用户”的请求固定到同一台后端,不同用户依然会分散到不同后端。虽然IP哈希可能因为某个IP请求量过大导致轻微不均,但配合一致性哈希、Cookie粘滞和合理权重,整体均衡性是可以接受的。会话保持与负载均衡是共存关系,不是互斥关系。

为何常见:把“会话粒度”和“全部流量粒度”混为一谈,以为粘住了一个用户就等于粘住了所有人。

误区缓存加速这么好,那我尽量多缓存一些东西、把缓存时间设长一点,后端不就彻底解放了吗?

正解缓存是有代价的。存储要占用内存或磁盘,过期时间过长会让用户看到陈旧数据,高动态内容(如实时库存、热点榜单)根本不适合缓存。成熟的策略是区分静态与动态内容、尊重Cache-Control语义、用版本号主动失效。缓存是“权衡的艺术”,不是“越多越美”。

为何常见:看到命中率一路飙升确实很爽,但容易忽视“新鲜度”和“一致性”这两个反向指标。

面试题

Q1. 反向代理最核心的职责是什么?

单选题 · easy

  • A.替客户端访问外部网络
  • B.代表后端服务器接待客户端请求并转发← 正确答案
  • C.负责DNS域名解析
  • D.加密所有网络数据包

答案:B。反向代理站在服务器一侧,作为后端统一入口接待客户端请求并转发响应。A描述的是正向代理,C是DNS服务,D是TLS的功能,都不对。

Q2. 正向代理与反向代理的关键区别在于?

单选题 · easy

  • A.前者快后者慢
  • B.前者代表客户端,后者代表服务器端← 正确答案
  • C.前者用TCP后者用UDP
  • D.前者只在高版本Nginx中支持

答案:B。正向代理代表客户端去访问外部世界(如VPN),反向代理代表后端接待外部访客。方向是两者的根本差异,B正确。速度快慢、协议差异都不是两者的本质区别。

Q3. 四层代理与七层代理最重要的差异是?

单选题 · mid

  • A.四层更快但读不懂HTTP内容← 正确答案
  • B.七层一定更安全
  • C.四层只支持TCP不支持UDP
  • D.七层不能做负载均衡

答案:A。四层代理工作在传输层,只看IP和端口,转发效率高但无法理解URL、Header等内容;七层代理能解析HTTP协议做智能路由,代价是额外解析开销。B绝对化错误,C不准确,D显然错误。

Q4. Nginx加权轮询中,三台后端权重分别为3、2、1,则第一台被选中的概率是?

单选题 · mid

  • A.1/3
  • B.1/2← 正确答案
  • C.1/6
  • D.2/3

答案:B。权重总和为3+2+1=6,第一台权重3,选中概率=3/6=1/2。权重越高的机器承担的流量占比越大,这是加权轮询的核心逻辑。

Q5. SSL卸载的主要价值是?

单选题 · mid

  • A.让用户不再使用HTTPS
  • B.由代理统一承载加解密开销,减轻后端CPU负担← 正确答案
  • C.消除所有网络攻击
  • D.加快DNS解析速度

答案:B。TLS握手涉及非对称加密和证书校验,非常耗CPU。SSL卸载让代理统一完成解密,后端只处理明文HTTP。用户仍然使用HTTPS访问代理,所以A错误;C过于绝对,D与DNS无关。

Q6. 以下属于反向代理健康检查方式的有?

多选题 · mid

  • A.主动探测:代理定期向后端发探测请求← 正确答案
  • B.被动检查:根据真实请求的失败次数判定← 正确答案
  • C.人工重启后端服务器
  • D.通过DNS轮询探测

答案:AB。主动探测是代理定时询问后端“你还好吗”,被动检查是根据真实请求的连续失败次数判断。C是运维操作,不是代理机制;D与健康检查无关。

Q7. 会话保持的常见实现方式包括?

多选题 · hard

  • A.IP哈希← 正确答案
  • B.Cookie粘滞← 正确答案
  • C.一致性哈希← 正确答案
  • D.随机轮询

答案:ABC。IP哈希按客户端IP取模固定后端;Cookie粘滞通过代理植入的Cookie识别归属;一致性哈希在后端扩缩容时减少会话迁移。随机轮询恰恰会破坏会话保持,所以D不选。

Q8. 缓存命中率h=H/(H+M),若命中次数为800、未命中200,则命中率是?

单选题 · mid

  • A.20%
  • B.50%
  • C.80%← 正确答案
  • D.100%

答案:C。H=800,M=200,总请求1000,命中率=800/1000=80%。80%的请求由缓存直接回答,只有20%穿透到后端,这正是缓存加速的直观体现。

Q9. 反向代理在安全隔离方面的价值体现在?

多选题 · hard

  • A.隐藏后端真实IP和端口← 正确答案
  • B.在入口层做IP黑名单和限流← 正确答案
  • C.对所有数据进行磁盘加密
  • D.统一SSL终止避免后端暴露证书← 正确答案

答案:ABD。反向代理是唯一入口,外部无法触达后端IP;代理层可以施加访问控制和限流;统一管理SSL证书避免每台后端各自暴露。C是存储加密,与代理无关。

Q10. 灰度发布中,若新版本分流占比r=0.1,意味着?

单选题 · easy

  • A.10%的请求进入新版本,90%留在旧版本← 正确答案
  • B.所有请求同时访问新旧版本
  • C.新版本直接下线
  • D.只有管理员能访问新版本

答案:A。r=V_new/(V_new+V_old)=0.1,即10%流量打到新版本、90%走旧版本。观察稳定后可逐步放大r到1.0完成全量发布,A正确。