Skip to content

反向代理(Reverse Proxy)

反向代理是一种非常常见的网站部署方式,负责接受客户端的请求,将请求转发到后端服务器,并将后端的响应返回给客户端。客户端并不知道其请求被代理了,认为反向代理服务器就是目标服务器

下面是一张来自Cloudflare的图例:

image

反向代理的工作流程

  1. 客户端请求:客户端(如浏览器)向反向代理服务器发送请求(例如访问 https://example.com

  2. 反向代理转发:反向代理接收到请求后,根据配置将请求转发到后端服务器(例如 http://localhost:8080

  3. 后端处理:后端服务器处理请求并生成响应(如 HTML 页面)

  4. 代理返回响应:反向代理接收后端的响应并将其发送回客户端

举一个简单的例子吧,如果你在服务器上部署了一个服务,他的端口是8080,但是你不想使用例如 http://IP:8080 这种“丑陋”的方式进行访问,你想用户能使用 https://example.com 这种安全而优雅的方式进行访问,那么这时候你就可以使用反向代理,反向代理可以将来自用户的请求(https://example.com)转发到后端服务器(http://IP:8080)去

反向代理的用途

  1. 负载均衡
  • 将客户端的请求分发到多台后端服务器上,均衡负载,提高系统性能和可靠性。
  1. 安全性
  • 隐藏后端服务器的真实 IP 和端口,增强安全性。

  • 可以通过配置 HTTPS,让反向代理负责加密和解密流量,而后端服务器只需处理明文通信。

  1. 缓存和加速
  • 反向代理可以缓存静态资源(如图片、CSS、JS文件),减少后端负载并加快响应速度。
  1. 统一入口
  • 将多个服务整合到一个入口点,客户端只需访问代理服务器,而无需直接与每个服务交互。
  1. 协议转换
  • 反向代理可以在客户端与后端之间进行协议转换(例如从 HTTPS 转为 HTTP)。
  1. 跨域解决
  • 反向代理可以帮助前端绕过浏览器的跨域限制(CORS)。

常见的一些用于反向代理的工具

Nginx

强大高效的代理工具,下面展示的proxy_pass就是设置的反向代理的后端地址

nginx
server {
    listen 80;
    server_name example.com;
    
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Caddy

使用 Go 写的一个轻量,易于配置,自动管理 HTTPS 的现代反向代理服务器,我个人非常喜欢用,看到下面的配置文件,和 Nginx 进行对比你应该就知道原因了

Caddyfile
example.com {
    reverse_proxy localhost:8080
}

Traefik

个人没有用过,据说要和k3s或者k8s这种分布式或者微加工一起用才能展现出真正的实力

反向代理如何处理流量

我相信你肯定很好奇,为什么输入了网址,反向代理服务器就知道要将流量转发到哪个后端服务器

DNS解析:

  • 用户在浏览器中输入网址(如 https://example.com
  • 浏览器通过 DNS 查询获取反向代理服务器的 IP 地址
  • 请求被发送到反向代理服务器。

反向代理服务器接收请求:

  • 反向代理服务器监听客户端的请求(通常在端口 80 或 443)
  • 根据请求的 URL、主机名、路径等信息,决定将请求转发到哪个后端服务器

选择目标服务器:

  • 根据预先配置的规则,反向代理决定目标服务器。例如:
    • 根据域名(Host):将 example.com 转发到 http://127.0.0.1:8080
    • 根据路径(/api 或 /static):将 API 请求转发到后端 A,静态资源请求转发到后端 B
    • 根据负载均衡策略:如轮询、最少连接数等,选择负载较低的服务器

将请求转发到目标服务器:

  • 反向代理会将客户端的请求封装并发送给目标服务器,同时添加一些附加信息(如 X-Forwarded-For 表头,我们又称“请求头”,指明客户端真实 IP)

例如:

makefile
GET /api/data HTTP/1.1
Host: example.com
X-Forwarded-For: 192.168.1.100

目标服务器仅看到来自反向代理的请求,而不会直接与客户端通信

接收目标服务器的响应:

  • 后端服务器处理请求,生成响应并返回给反向代理服务器

代理返回响应给客户端:

反向代理将后端服务器的响应转发给客户端,客户端认为响应来自反向代理

贡献者

The avatar of contributor named as Liueic Aicnal Liueic Aicnal

页面历史