4、负载均衡与反向代理:Nginx安装与配置、反向代理原理、负载均衡策略、健康检查配置

在服务目录平台的多环境架构中,Nginx 承担着流量入口与分发枢纽的角色。本章将系统讲解 Nginx 的核心安装流程、反向代理工作机制、负载均衡策略选型以及健康检查配置方法,帮助你在准入控制与项目部署之间建立稳定、可观测的流量转发层。

4.1 Nginx 安装与基础配置

Nginx 支持主流 Linux 发行版及容器化部署。以下以 CentOS 7/8 和 Ubuntu 20.04/22.04 为例,给出生产环境推荐安装方式。

操作系统 安装方式 关键命令 配置文件路径
CentOS 7/8 EPEL + yum yum install epel-release -y && yum install nginx -y /etc/nginx/nginx.conf
Ubuntu 20.04/22.04 apt 官方源 apt update && apt install nginx -y /etc/nginx/nginx.conf
Docker 容器 官方镜像 docker run -d --name nginx -p 80:80 nginx:alpine /etc/nginx/nginx.conf
生产建议: 使用 Docker 或 Kubernetes 部署 Nginx 时,建议将配置文件通过 ConfigMap 或挂载卷注入,避免在容器内手动修改。同时开启 --restart=always 策略保证高可用。

安装完成后,通过 nginx -t 校验配置语法,使用 systemctl start nginx 或 nginx -s reload 启动/重载服务。

4.2 反向代理原理

反向代理位于客户端与后端服务器之间,客户端感知不到后端真实地址。Nginx 接收客户端请求后,根据配置将请求转发到内部服务,并将响应返回给客户端。核心流程如下:

  1. 客户端请求 → 访问 Nginx 监听端口(如 80/443)。
  2. Nginx 解析 → 根据 location 块匹配请求 URI。
  3. 转发决策 → 通过 proxy_pass 指令将请求发送到上游服务器组。
  4. 后端处理 → 上游服务处理请求并返回响应。
  5. 响应回传 → Nginx 将后端响应返回给客户端,可附加缓存、压缩、头修改等处理。
关键配置示例:
server {
    listen 80;
    server_name catalog.internal.com;

    location /api/ {
        proxy_pass http://backend_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

反向代理的核心价值在于:隐藏后端结构、统一入口、集中处理 SSL 终止、支持灰度发布与流量治理。

反向代理请求流程 客户端 Nginx 反向代理 后端服务1 后端服务2 后端服务3 请求 响应 流程说明 ① 客户端请求 Nginx ② Nginx 转发到后端 ③ 后端响应回传

4.3 负载均衡策略

Nginx 通过 upstream 模块定义后端服务器组,并支持多种负载均衡算法。选择正确的策略直接影响系统吞吐量与响应延迟。

策略名称 配置关键字 工作原理 适用场景
轮询(默认) 无 / round-robin 按顺序依次分发请求,权重可调 后端性能均匀,无状态服务
最少连接 least_conn 优先转发给当前活跃连接数最少的后端 长连接、请求处理时间差异大的场景
IP Hash ip_hash 根据客户端 IP 计算 hash,固定转发到同一后端 需要会话保持(Session Sticky)
通用 Hash hash $request_uri 自定义 key 进行 hash 分配 缓存亲和性、URL 路由分发
随机 random 从可用后端中随机选取 测试环境、流量模拟
注意: 使用 ip_hash 时,如果后端扩缩容,hash 映射会重新分布,可能导致会话丢失。生产环境建议结合 Redis 或 Cookie 实现外部会话存储。

以下是一个包含权重与备份节点的 upstream 配置示例:

upstream catalog_backend {
    least_conn;
    server 10.0.1.10:8080 weight=3;
    server 10.0.1.11:8080 weight=2;
    server 10.0.1.12:8080 backup;
}

server {
    listen 80;
    location / {
        proxy_pass http://catalog_backend;
    }
}

4.4 健康检查配置

Nginx 开源版默认只提供被动健康检查(根据请求响应判断),商业版 Nginx Plus 支持主动健康检查。对于服务目录平台,推荐结合第三方模块或使用开源版 + 脚本实现。

4.4.1 被动健康检查(开源版)

通过 max_fails 和 fail_timeout 参数控制:

upstream catalog_backend {
    server 10.0.1.10:8080 max_fails=3 fail_timeout=30s;
    server 10.0.1.11:8080 max_fails=3 fail_timeout=30s;
}

当后端在 fail_timeout 内失败次数达到 max_fails,Nginx 将其标记为不可用,并在超时后重新尝试。

4.4.2 主动健康检查(Nginx Plus / 第三方模块)

使用 ngx_http_healthcheck_module 或商业版配置:

upstream catalog_backend {
    zone catalog 64k;
    server 10.0.1.10:8080;
    server 10.0.1.11:8080;
}

server {
    listen 80;
    location / {
        proxy_pass http://catalog_backend;
        health_check interval=5s fails=3 passes=2 uri=/health;
    }
}

参数说明:

  • interval:健康检查间隔时间。
  • fails:连续失败次数后标记为不健康。
  • passes:连续成功次数后标记为健康。
  • uri:检查请求的路径,后端需返回 2xx/3xx 状态码。
最佳实践: 后端服务应暴露独立的 /health 或 /actuator/health 端点,返回 JSON 格式的健康状态,包含数据库连接、缓存、依赖服务等关键组件的存活信息。
健康检查与负载均衡协同流程 Nginx 负载均衡器 健康检查模块 后端服务 A 后端服务 B (不健康) 后端服务 C 健康检查 /health 仅转发到健康节点 协同逻辑 ① 健康检查模块定期探测 ② 后端 B 连续失败,标记不健康 ③ 负载均衡跳过不健康节点 ④ 请求只分发到 A 和 C

4.5 生产环境配置清单

在服务目录平台上线前,请逐项确认以下配置项:

配置项 推荐值 / 操作 说明
worker_processes auto 自动匹配 CPU 核心数
worker_connections 10240 单 worker 最大并发连接数
keepalive_timeout 65 客户端长连接超时
proxy_read_timeout 60s 后端响应超时,防止慢请求堆积
proxy_buffer_size 8k 头部缓冲区,避免大 header 截断
client_max_body_size 10m 根据业务上传文件大小调整
日志格式 包含 $upstream_addr $upstream_status 便于排查后端分发情况
日志格式配置示例:
log_format upstream_log '$remote_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent" '
                        'upstream: $upstream_addr $upstream_status';

access_log /var/log/nginx/access.log upstream_log;

通过以上配置,Nginx 层即可实现流量分发、故障隔离与可观测性,为服务目录平台的稳定运行提供坚实基础。