第4章 反向代理与负载均衡
——构建高可用后端服务架构
本章将深入讲解如何用 Nginx 实现反向代理、负载均衡策略,并覆盖 WebSocket/gRPC 等高级代理配置,让你轻松应对高并发场景。
4.1 反向代理基础配置
4.1.1 proxy_pass 核心指令
location /api/ {
proxy_pass http://localhost:3000; # 转发到本地 3000 端口
}
关键细节:
- 带
/结尾:/api/user→http://localhost:3000/user(去除/api前缀) - 不带
/:/api/user→http://localhost:3000/api/user(保留完整 URI)
实际应用场景:
- 当后端服务需要原始路径时(如认证中间件),使用无
/配置。 - 当需要隐藏路径前缀时(如微服务网关),使用带
/配置。
4.1.2 请求头处理
默认情况下,Nginx 转发请求时会修改请求头,导致后端无法获取真实客户端信息。需显式配置以下头字段:
location / {
proxy_set_header Host $host; # 传递原始域名
proxy_set_header X-Real-IP $remote_addr; # 客户端真实 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 代理链 IP
proxy_set_header X-Forwarded-Proto $scheme; # 原始协议(http/https)
proxy_pass http://backend;
}
头字段作用说明:
| 字段 | 示例值 | 后端获取方式(Node.js) |
|---|---|---|
X-Real-IP | 203.0.113.5 | req.headers['x-real-ip'] |
X-Forwarded-For | 203.0.113.5, 10.0.1.2 | 解析 IP 链首个地址 |
X-Forwarded-Proto | https | 判断是否加密连接 |
4.1.3 超时与重试机制
网络不稳定时,合理的超时和重试配置可提升系统鲁棒性:
location / {
proxy_pass http://backend;
proxy_connect_timeout 5s; # 后端连接超时(默认 60s)
proxy_read_timeout 60s; # 读取响应超时(如长轮询接口)
proxy_send_timeout 30s; # 发送请求超时(上传大文件时调整)
proxy_next_upstream error timeout http_502; # 502 或超时触发重试
proxy_next_upstream_tries 3; # 最大重试次数
proxy_next_upstream_timeout 10s; # 重试总时间限制
}
生产建议:
- 对支付类接口禁用重试(
proxy_next_upstream off),避免重复扣款。 - 静态资源可适当延长
proxy_read_timeout,动态 API 建议不超过 10s。
4.2 负载均衡策略
4.2.1 定义 upstream 组
通过 upstream 模块定义后端服务器集群,支持权重、备份服务器等配置:
upstream backend {
server 10.0.1.2:8080 weight=3; # 权重 3,处理 60% 流量
server 10.0.1.3:8080; # 默认权重 1
server backup.example.com:8080 backup; # 备用节点(主节点宕机时启用)
keepalive 32; # 复用 TCP 连接,提升性能
}
4.2.2 负载均衡算法对比
Nginx 提供四种常用算法,适应不同场景:
| 算法 | 配置方式 | 优点 | 缺点 |
|---|---|---|---|
| 轮询(默认) | server 1; server 2; | 简单公平 | 忽略服务器负载差异 |
| 权重 | server 1 weight=5; | 适配异构服务器 | 需手动调整权重 |
| IP Hash | ip_hash; | 会话保持(如购物车) | 节点宕机导致哈希失衡 |
| 最少连接 | least_conn; | 动态分配最优节点 | 计算开销略高 |
示例:会话保持场景
upstream shopping_cart {
ip_hash;
server 10.0.1.2;
server 10.0.1.3;
}
4.2.3 健康检查实现
Nginx Plus 提供原生健康检查,开源版可通过第三方模块或定时脚本实现:
# 使用 nginx_upstream_check_module(需编译安装)
upstream backend {
server 10.0.1.2:8080;
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
4.3 高级代理功能
4.3.1 WebSocket 代理配置
WebSocket 需升级 HTTP 协议,关键配置如下:
location /chat/ {
proxy_pass http://websocket_backend;
proxy_http_version 1.1; # 必须使用 HTTP/1.1
proxy_set_header Upgrade $http_upgrade; # 协议升级头
proxy_set_header Connection "Upgrade"; # 保持长连接
proxy_read_timeout 3600s; # 避免超时断开
}
4.3.2 gRPC 服务代理
gRPC 基于 HTTP/2,需 Nginx 1.13.10+ 版本支持:
location / {
grpc_pass grpc://backend:50051;
grpc_set_header X-Real-IP $remote_addr; # 传递客户端 IP
grpc_read_timeout 60s; # 调整超时时间
}
4.3.3 代理缓存优化
缓存静态接口响应,降低后端负载:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=api_cache:10m inactive=60m;
location /products/ {
proxy_cache api_cache;
proxy_cache_valid 200 302 10m; # 成功响应缓存 10 分钟
proxy_cache_key "$host$request_uri"; # 缓存键规则
proxy_pass http://product_service;
}
实战示例:全栈应用架构
以下配置整合前端静态资源、Node.js API、Python 微服务和 WebSocket:
upstream node_app {
least_conn;
server 10.0.1.2:3000;
server 10.0.1.3:3000;
}
server {
listen 80;
server_name app.example.com;
# 前端 SPA 应用
location / {
root /var/www/html;
try_files $uri /index.html;
}
# Node.js 接口集群
location /api/ {
proxy_pass http://node_app/;
proxy_cache api_cache;
}
# WebSocket 实时通信
location /ws/ {
proxy_pass http://node_app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
本章小结
- 反向代理:掌握
proxy_pass的 URI 处理规则、请求头传递和超时优化。 - 负载均衡:根据业务特点选择轮询、权重、IP Hash 或最少连接策略。
- 高级场景:支持 WebSocket/gRPC 协议代理,利用缓存降低后端压力。
下一步:第5章将深入讲解 HTTPS 配置与安全加固,涵盖 TLS 1.3、HSTS、CSP 等关键安全策略,保护服务免受中间人攻击与数据泄露风险。
动手实验
-
使用
proxy_pass将/blog/路径代理到本地 8080 端口,并保留原始路径。 -
创建包含 3 台虚拟服务器的 upstream 组,配置权重实现 70%、20%、10% 的流量分配。

9997

被折叠的 条评论
为什么被折叠?



