反向代理 vs 负载均衡:何时使用及 Nginx 配置
你可能经常听到“反向代理”和“负载均衡”这两个术语被互换使用。但在配置 Nginx 时,了解它们的区别至关重要——这会影响你如何架构基础设施、处理 SSL 以及扩展应用。
本指南将消除这些困惑。你将了解它们各自的作用、何时使用哪一个,以及如何在 Nginx 中通过清晰实用的示例进行设置。
什么是反向代理?
反向代理位于客户端和后端服务器之间。它接收客户端请求,将其转发到相应的后端,并返回响应。客户端从不直接与后端通信。
常见用途:
- SSL 终止:在代理处处理 HTTPS,后端只需处理 HTTP。
- 缓存:存储静态资源或 API 响应,以减少后端负载。
- 安全性:隐藏后端细节、过滤请求并缓解 DDoS 攻击。
- 压缩:在发送给客户端之前对响应进行 Gzip 或 Brotli 压缩。
Nginx 通常用作 Node.js、Python(Gunicorn/uWSGI)或 Java(Tomcat)等应用服务器前面的反向代理。
什么是负载均衡?
负载均衡器将传入流量分发到多个后端服务器。其主要目标是提高可用性、可扩展性和容错能力。
关键特性:
- 流量分发:使用轮询、最少连接或 IP 哈希等算法分散请求。
- 健康检查:自动停止向不健康的服务器发送流量。
- 会话保持:在需要时让用户始终访问同一后端。
负载均衡器可以是硬件(F5、Citrix)或软件(Nginx、HAProxy、云负载均衡器)。Nginx 的 upstream 模块使其成为一个强大的软件负载均衡器。
反向代理 vs 负载均衡:关键区别
| 方面 | 反向代理 | 负载均衡器 |
|---|---|---|
| 主要目的 | 转发请求,添加功能(SSL、缓存) | 将负载分发到多个服务器 |
| 后端数量 | 通常一个(或几个) | 多个,通常很多 |
| 重点 | 功能性、安全性、性能 | 可扩展性、高可用性 |
| 健康检查 | 可选 | 必需 |
实际上,负载均衡器是一种专门的反向代理。许多工具(包括 Nginx)可以同时完成两者。
何时使用反向代理
在以下情况使用反向代理:
- 服务于单个后端服务器,但需要 SSL、缓存或压缩。
- 在一个 IP 后面通过不同路径或子域托管多个应用。
- 通过不直接暴露后端来增加额外的安全层。
示例: 一个运行在端口 3000 上的 Node.js API,由 Nginx 处理 HTTPS 并提供静态文件。
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/nginx/ssl/api.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/api.example.com.key;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
何时使用负载均衡
在以下情况使用负载均衡:
- 有多个后端服务器来处理高流量。
- 需要高可用性——如果一台服务器故障,其他服务器可以接管。
- 进行滚动部署或蓝绿部署。
示例: 三个 Node.js 实例通过 Nginx 使用轮询方式负载均衡。
upstream backend {
server 10.0.0.1:3000;
server 10.0.0.2:3000;
server 10.0.0.3:3000;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Nginx 将均匀分发请求。你可以添加健康检查和其他参数来微调行为。
在 Nginx 中结合两种角色
大多数实际部署中,Nginx 同时用作反向代理和负载均衡器。例如:
upstream app_servers {
least_conn;
server 10.0.0.1:3000 max_fails=3 fail_timeout=30s;
server 10.0.0.2:3000 max_fails=3 fail_timeout=30s;
server 10.0.0.3:3000 backup;
}
server {
listen 443 ssl;
server_name app.example.com;
ssl_certificate /etc/nginx/ssl/app.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/app.example.com.key;
location /static/ {
root /var/www/static;
expires 30d;
}
location / {
proxy_pass http://app_servers;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
在这里,Nginx 终止 SSL、提供静态文件,并通过健康检查在三个应用服务器之间进行负载均衡。
Nginx 作为反向代理/负载均衡器的最佳实践
- 设置正确的头信息:始终传递
Host、X-Real-IP和X-Forwarded-For,以便后端知道原始客户端。 - 启用 HTTP/2:在
listen指令中添加http2以获得更好的性能。 - 调整缓冲区和超时:根据应用行为调整
proxy_buffer_size、proxy_read_timeout。 - 使用健康检查:Nginx 开源版具有被动检查;Nginx Plus 提供主动检查。
- 明智地记录日志:使用自定义日志格式捕获上游响应时间,以便调试。
分析 Nginx 日志对于发现瓶颈至关重要。像 Nginx 日志分析器 这样的工具可以帮助你解析访问日志,快速识别缓慢的上游或错误。
常见问题
Nginx 可以同时作为反向代理和负载均衡器吗?
可以。Nginx 可以同时终止 SSL、缓存内容并将请求分发到多个后端。upstream 块定义后端池,而 proxy_pass 指令转发请求。
如果只有一个后端服务器,我需要负载均衡器吗?
不一定。仅反向代理就可以处理 SSL、缓存和安全性。但添加具有多个后端的负载均衡器可以提高可用性——如果一台服务器故障,其他服务器可以继续服务流量。
Nginx 如何选择将请求发送到哪个后端?
默认情况下,Nginx 使用轮询。你可以通过 least_conn(最少连接)、ip_hash(基于客户端 IP 的会话保持)或 hash(自定义键)等指令更改此行为。
准备好优化你的 Nginx 设置了吗?首先使用我们的 免费 Nginx 日志解析器 分析日志,发现性能问题并微调配置。