反向代理(Reverse Proxy)
反向代理是一种非常常见的网站部署方式,负责接受客户端的请求,将请求转发到后端服务器,并将后端的响应返回给客户端。客户端并不知道其请求被代理了,认为反向代理服务器就是目标服务器
下面是一张来自Cloudflare的图例:
反向代理的工作流程
客户端请求:客户端(如浏览器)向反向代理服务器发送请求(例如访问 https://example.com)
反向代理转发:反向代理接收到请求后,根据配置将请求转发到后端服务器(例如 http://localhost:8080)
后端处理:后端服务器处理请求并生成响应(如 HTML 页面)
代理返回响应:反向代理接收后端的响应并将其发送回客户端
举一个简单的例子吧,如果你在服务器上部署了一个服务,他的端口是8080,但是你不想使用例如 http://IP:8080 这种“丑陋”的方式进行访问,你想用户能使用 https://example.com 这种安全而优雅的方式进行访问,那么这时候你就可以使用反向代理,反向代理可以将来自用户的请求(https://example.com)转发到后端服务器(http://IP:8080)去
反向代理的用途
- 负载均衡:
- 将客户端的请求分发到多台后端服务器上,均衡负载,提高系统性能和可靠性。
- 安全性:
隐藏后端服务器的真实 IP 和端口,增强安全性。
可以通过配置 HTTPS,让反向代理负责加密和解密流量,而后端服务器只需处理明文通信。
- 缓存和加速:
- 反向代理可以缓存静态资源(如图片、CSS、JS文件),减少后端负载并加快响应速度。
- 统一入口:
- 将多个服务整合到一个入口点,客户端只需访问代理服务器,而无需直接与每个服务交互。
- 协议转换:
- 反向代理可以在客户端与后端之间进行协议转换(例如从 HTTPS 转为 HTTP)。
- 跨域解决:
- 反向代理可以帮助前端绕过浏览器的跨域限制(CORS)。
常见的一些用于反向代理的工具
Nginx
强大高效的代理工具,下面展示的proxy_pass就是设置的反向代理的后端地址
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 进行对比你应该就知道原因了
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)
例如:
GET /api/data HTTP/1.1
Host: example.com
X-Forwarded-For: 192.168.1.100目标服务器仅看到来自反向代理的请求,而不会直接与客户端通信
接收目标服务器的响应:
- 后端服务器处理请求,生成响应并返回给反向代理服务器
代理返回响应给客户端:
反向代理将后端服务器的响应转发给客户端,客户端认为响应来自反向代理