第4章 反向代理与负载均衡

第4章 反向代理与负载均衡

——构建高可用后端服务架构

本章将深入讲解如何用 Nginx 实现反向代理、负载均衡策略,并覆盖 WebSocket/gRPC 等高级代理配置,让你轻松应对高并发场景。


4.1 反向代理基础配置

4.1.1 proxy_pass 核心指令

location /api/ {
    proxy_pass http://localhost:3000;  # 转发到本地 3000 端口
}

关键细节

  • / 结尾/api/userhttp://localhost:3000/user(去除 /api 前缀)
  • 不带 //api/userhttp://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-IP203.0.113.5req.headers['x-real-ip']
X-Forwarded-For203.0.113.5, 10.0.1.2解析 IP 链首个地址
X-Forwarded-Protohttps判断是否加密连接

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 Haship_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 等关键安全策略,保护服务免受中间人攻击与数据泄露风险。


动手实验

  1. 使用 proxy_pass/blog/ 路径代理到本地 8080 端口,并保留原始路径。

  2. 创建包含 3 台虚拟服务器的 upstream 组,配置权重实现 70%、20%、10% 的流量分配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值