深蓝黑背景品牌封面:底部栏式标题区,主标题「反向代理到底代理了什么」,副标题「为什么都在用 Nginx」;上半部分原创装饰——左侧一枚客户端圆点,箭头指向中央一道竖直的「代理门」,门后再扇出三条箭头分别指向三台服务器方块,寓意客户端只认门、看不见门后的真实服务;左下标注「经典题解析 · 网络」,右下标注「Day 09 · 10-17」 图 1:本文封面,客户端只认那道门,看不见门后的真实服务。

先说明属性:这是一篇经典题解析,题目出自本地历史面试资料(原题问「使用反向代理服务器的优点是什么」),与任何公司的当前招聘无关。它看起来是名词解释,实际上考的是你能不能画清一个系统的流量入口——说不清代理层职责的人,架构图里入口永远是一团云。

想象面试现场:「反向代理和正向代理有什么区别?为什么大家都用 Nginx 做反向代理?」

核心结论一句话

正向代理站在客户端一侧,替客户端访问外面,服务端不知道真实客户端是谁;反向代理站在服务端一侧,替服务端接客,客户端不知道真实服务端是谁。记忆锚点是箭头方向相反。反向代理层通常扛着五项职责:转发与路由、负载均衡、SSL 卸载、静态缓存、限流与防护。Nginx 流行的原因不是某一项最强,而是五项职责在一个进程里都够用、配置统一、资源占用低。

先分清正反,再展开职责。

正向代理的典型场景是内网用户通过代理访问外网:目标是隐藏或放行客户端。反向代理的典型场景是用户访问一个域名,代理把请求分发给门后的一群服务器:目标是隐藏并组织服务端。一句话区分:代理替谁站着,就姓什么。

职责一:转发与路由。 按域名和路径把请求分发到不同后端,proxy_pass 指向哪里,流量就去哪里;同时用 proxy_set_header 把客户端真实 IP 以 X-Real-IP、X-Forwarded-For 的形式带给后端——代理替客户端发了请求,后端日志里不补这个头就全是代理的地址。

职责二:负载均衡。 用 upstream 声明一组后端,默认按轮询分摊;加 least_conn 改成把新请求发给当前连接最少的机器,适合请求耗时不均的场景;加 ip_hash 让同一客户端固定落到同一台,适合需要会话粘性的老系统;还可以给 server 配 weight,权重 3 的机器大约扛走五分之三的新请求。后端挂了怎么办?被动健康检查内置在代理里:连续失败达到 max_fails 次(默认 1 次),这台机器在 fail_timeout 窗口内被标记为不可用,流量自动绕开。

职责三:SSL 卸载。 证书和私钥集中配在代理层:listen 443 ssl 加上证书文件,TLS 握手与加解密全部在 Nginx 完成,后端走内网明文。官方文档明确提醒握手是 SSL 里最耗 CPU 的操作,应对办法是开 keepalive 复用连接、开共享会话缓存复用握手结果——一兆字节的会话缓存大约能存四千个会话。后端集群因此不用每台都配证书、烧 CPU 做加解密。

职责四:静态缓存。 图片和静态资源直接由代理应答或缓存,后端只处理动态请求。职责五:限流与防护。 在入口按 IP、按路径限制速率,异常流量在到达应用前就被拦下。五项合起来,反向代理成了系统的总前台。

对比加谱系图:上部左右对照——正向代理站在客户端一侧,替客户端访问外面,服务端不知道真实客户端是谁;反向代理站在服务端一侧,替服务端接客,客户端不知道真实服务端是谁。箭头方向相反是记忆锚点。下部是反向代理层的五项职责横排:转发与路由(按路径域名分发到后端)、负载均衡(轮询权重最少连接等策略分摊流量)、SSL 卸载(证书与加解密集中在代理层,后端走明文内网)、静态缓存(图片与静态资源直接由代理应答)、限流与防护(在入口挡住异常流量)。底部结论:Nginx 流行的原因不是某一项最强,而是五项职责在一个进程里都够用、配置统一、资源占用低 图 2:正反代理的分工与代理层的五项职责。

可能的追问与易错点。

「负载均衡策略怎么选?」无状态服务默认轮询,耗时差异大用 least_conn,临时需要会话粘性用 ip_hash 但要知道它会把压力钉在固定机器上。「反向代理和网关在面试里怎么区分?」代理层管流量转发与防护,网关在此之上还管鉴权、编排、协议转换等业务语义,职责有重叠但抽象层级不同。易错点有三:一是把反向代理等同于负载均衡,均衡只是五项职责之一;二是忘记透传真实 IP,后端拿到的全是代理地址,风控与审计直接失真;三是 SSL 卸载后对内网明文毫无边界意识,卸载不等于放弃内网安全,敏感链路仍需二次加密或隔离。AI 应用里这套东西每天都在用:模型服务多实例的均衡、API 的 SSL 卸载与入口限流,全都落在这一层。

给你的练习:本机装一个 Nginx,起两个监听不同端口的 demo 服务,写一个 upstream 做一次轮询,再改成 least_conn 观察分发差异。十分钟,胜过背一小时名词。

你项目里的反向代理扛了几项职责?有没有踩过「后端拿不到真实 IP」的坑?欢迎分享。