跳转到内容
Proxy Types 1 分钟阅读 921 次浏览

反向代理

反向代理是 Web 服务器前的门禁,可提升安全性、性能与可靠性。了解它的工作原理。

Security
反向代理

反向代理(reverse proxy)是位于一台或多台 Web 服务器前端的服务器,它拦截客户端请求并转发到相应的后端服务器,然后把服务器的响应返回给客户端,就像响应来自代理本身一样。它充当中间层,对外部客户端呈现统一的接口,同时在内部管理服务器资源。

什么是反向代理?

反向代理运行在网络边缘,位于客户端与源站服务器之间。当客户端请求某个资源时,请求首先被送到反向代理。反向代理随后决定由哪台后端服务器处理该请求,将请求转发过去,接收响应并回传给客户端。这一过程对客户端是透明的,客户端会认为响应直接来自反向代理。

这种架构与正向代理(forward proxy)形成对比:正向代理位于客户端前端,把客户端的请求转发到互联网上的外部服务器。正向代理保护客户端匿名性并过滤出站流量,而反向代理则保护并优化后端服务器。

为什么需要反向代理

部署反向代理为 Web 应用和服务带来多方面优势,主要体现在安全性、性能和可靠性上。

更强的安全性

反向代理是后端基础设施的关键安全层。
* 抽象隔离:它隐藏源站服务器的 IP 地址和特征。客户端只与反向代理通信,从而避免后端服务器细节被直接暴露。
* 攻击缓解:反向代理可以过滤恶意流量,识别并拦截常见攻击模式(例如 SQL 注入、跨站脚本),并在分布式拒绝服务(DDoS)攻击期间吸收大量请求,从而保护后端服务器不被压垮。
* 集中式安全策略:Web 应用防火墙(WAF)规则或访问控制等安全策略,可以在反向代理层面对所有后端应用统一实施。

负载均衡

对于要求高可用和可扩展的应用,负载均衡必不可少。
* 流量分发:反向代理把进入的客户端请求分发到多台后端服务器,避免任何单台服务器成为瓶颈,并确保资源得到最优利用。
* 高可用:如果某台后端服务器故障或无响应,反向代理可以检测到问题并自动把流量导向健康的服务器,保持服务持续可用。
* 负载均衡算法:可采用多种算法,包括:
* Round Robin(轮询):按顺序将请求依次分发给每台服务器。
* Least Connections(最少连接):把请求路由到活动连接数最少的服务器。
* IP Hash:将同一客户端 IP 地址的请求导向同一台后端服务器,适合维持会话粘性。

缓存

反向代理可以通过缓存显著提升应用性能。
* 降低源站服务器负载:静态内容(例如图片、CSS 文件、JavaScript)以及被频繁访问的动态内容可以存放在反向代理的缓存中。后续对这些内容的请求直接由缓存提供,从而减轻后端服务器的负载。
* 更快的响应速度:通过从地理位置更近或随时可用的缓存提供内容,反向代理降低了延迟,提升了客户端感知到的速度。

SSL/TLS 终止

处理加密通信对后端服务器来说可能非常消耗 CPU。
* 卸载加密开销:反向代理可以终止来自客户端的 SSL/TLS 连接。它解密进入的请求,将其(以明文或重新加密的形式)转发到后端服务器,并在把响应发回客户端之前进行加密。
* 性能提升:把加解密运算卸载到反向代理,可释放后端服务器资源,使其专注于应用逻辑。
* 集中式证书管理:所有 SSL/TLS 证书都可以在同一处管理,简化证书续期与部署。

压缩

优化传输数据的体积对性能至关重要。
* 节省带宽:反向代理可以在把服务器响应发送给客户端之前进行压缩(例如使用 Gzip 或 Brotli)。这减少了网络上传输的数据量,节省带宽并加快页面加载,对连接较慢的客户端尤其明显。

URL 重写与 A/B 测试

反向代理在管理请求路由方面提供了灵活性。
* 灵活的路由规则:它们可以重写 URL、修改请求头,或根据既定规则(例如 URL 路径、HTTP 头、cookie)把特定请求导向不同的后端服务。这为微服务架构和 API 网关能力提供了便利。
* A/B 测试:通过把一定比例的用户或特定用户群导向应用的另一个版本(例如新功能的部署),反向代理让 A/B 测试无需改动客户端、也无需变更 DNS。

集中式日志与监控

所有客户端请求都经过反向代理,形成了统一的数据采集点。
* 统一数据源:请求日志、访问模式和性能指标都可以在反向代理上集中收集与分析,从而简化对多个后端服务的监控、故障排查和安全审计。

反向代理的工作流程

反向代理的运行流程包含以下几个步骤:
1. 客户端请求:客户端向与反向代理关联的域名发送 HTTP/S 请求。
2. 接收请求:反向代理接收该请求。
3. 策略执行:反向代理应用已配置的规则,可能包括:
* 安全检查(WAF、限速)。
* 缓存查询(若内容已缓存,则直接返回)。
* SSL/TLS 终止(如适用)。
* 应用负载均衡算法选择一台后端服务器。
4. 转发请求:反向代理把请求转发给选定的后端服务器,并可能修改请求头(例如用 X-Forwarded-For 保留原始客户端 IP)。
5. 后端处理:后端服务器处理请求并生成响应。
6. 接收响应:反向代理从后端服务器接收响应。
7. 响应加工:反向代理在把响应发给客户端之前,可能再做压缩等进一步处理。
8. 返回客户端:反向代理把最终响应发送给客户端,对外表现得就像源站服务器。

反向代理与正向代理的对比

虽然两类代理都充当中间人,但其用途和位置差别很大。

特性 反向代理 正向代理
用途 保护并优化后端服务器 保护并优化客户端对互联网的访问
使用者 服务器/网站所有者 客户端/用户(或代表用户的组织)
位置 位于源站服务器之前 位于客户端之前
可见性 客户端看到代理;后端服务器看到代理 源站服务器看到代理;客户端看到代理
主要目标 负载均衡、安全、缓存、SSL 终止 匿名性、访问控制、内容过滤、缓存
流量路径 客户端 -> 反向代理 -> 源站服务器 客户端 -> 正向代理 -> 互联网 -> 源站服务器

常见的反向代理软件

以下几款成熟软件被广泛用于搭建反向代理:
* Nginx:高性能 Web 服务器,同时以反向代理、负载均衡和 HTTP 缓存能力著称。
* Apache HTTP Server:借助 mod_proxy 等模块,Apache 也可以作为反向代理使用,不过高流量代理场景通常更偏向 Nginx。
* HAProxy:专为高可用负载均衡以及 TCP 和 HTTP 应用的代理而设计。
* Envoy Proxy:面向云原生应用的开源边缘与服务代理,常用于 service mesh 架构。
* Cloudflare:知名的内容分发网络(CDN),同时作为全球反向代理服务运行,提供安全、性能和可靠性方面的功能。

Nginx 反向代理配置示例

一份把请求分发到两台后端服务器(例如 backend1.example.combackend2.example.com)的基础 Nginx 反向代理配置:

http {
    # 定义一组用于负载均衡的后端服务器
    upstream backend_servers {
        # 后端服务器定义。Nginx 默认使用轮询(round-robin)。
        server backend1.example.com;
        server backend2.example.com;
        # server 192.168.1.100:8080; # 也可以使用 IP:端口
    }

    server {
        listen 80; # 在 80 端口监听 HTTP 请求
        server_name yourdomain.com www.yourdomain.com; # 您的域名

        # 定义根路径及其子路径的请求处理方式
        location / {
            # 将请求转发到上面定义的 upstream 组
            proxy_pass http://backend_servers;

            # 保留客户端原始的 Host 头
            proxy_set_header Host $host;
            # 保留客户端原始 IP 地址
            proxy_set_header X-Real-IP $remote_addr;
            # 将客户端 IP 追加到 X-Forwarded-For 头
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # 保留原始协议(HTTP 或 HTTPS)
            proxy_set_header X-Forwarded-Proto $scheme;

            # 可选:超时设置
            proxy_connect_timeout 60s;
            proxy_send_timeout 60s;
            proxy_read_timeout 60s;
        }

        # HTTPS 示例(在代理层做 SSL 终止)
        # listen 443 ssl;
        # ssl_certificate /etc/nginx/ssl/yourdomain.com.crt;
        # ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;
        # ... 其他 SSL 设置 ...
        # location / {
        #     proxy_pass http://backend_servers; # 到后端的流量可以是 HTTP
        #     ... 请求头 ...
        # }
    }
}
已更新: 03.03.2026
返回分类

试用我们的代理

遍布 100+ 国家的 20,000+ 代理

support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.