易君召
易君召
发布于 2026-11-13 / 4 阅读
0

Nginx 负载均衡实现原理 + 常用策略

核心:用 upstream {} 定义后端服务器集群,proxy_pass 转发到 upstream 组;Nginx 自带健康检查,后端宕机自动剔除,恢复后自动加回nginx。

模块:ngx_http_upstream_module(开源版内置)

一、最简基础模板

http {
    # 定义后端集群
    upstream backend_server {
        # 策略写在这里
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }

    server {
        listen 80;
        server_name lb.test.com;
        location / {
            proxy_pass http://backend_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

常用后端参数:

  • weight=5:权重

  • max_fails=2:最大失败次数

  • fail_timeout=10s:失败后隔离多久重试

  • backup:备用机,只有其他全部挂了才启用

  • down:标记永久下线

二、原生 5 种策略(开源版)

1. 轮询 round_robin(默认,不用写指令)

规则:请求按顺序轮流分发;故障自动剔除。 适合:后端机器性能接近、无会话绑定、无状态服务。

upstream backend {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}

2. 加权轮询(weight)

规则:权重越大分到请求越多。适合机器配置不一致。

upstream backend {
    server 127.0.0.1:8080 weight=3; # 3份流量
    server 127.0.0.1:8081 weight=1; # 1份流量
}

3. least_conn 最少连接

指令:least_conn; 规则:新请求分给当前活跃连接数最少的后端。 适合:请求处理时长差异很大(上传、大查询、慢接口)。

upstream backend {
    least_conn;
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}

4. ip_hash IP 哈希(会话保持)

指令:ip_hash; 规则:客户端 IP 做 hash,同一个 IP 永远打到同一台后端(后端宕机才切换),解决 session 粘滞问题nginx。

注意:Nginx 对 IPv4 只取前 3 段哈希;如果用户在 NAT 网关后(公司内网、手机运营商出口),大量用户会被分到同一台;扩容 / 减节点会大量重映射。

upstream backend {
    ip_hash;
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}

5. hash 通用哈希(一致性哈希 consistent)

指令:hash $key [consistent];,Nginx1.7.2 + 支持nginx

  • 不加 consistent:普通 hash,增删节点大部分 key 会漂移

  • 加 consistent:Ketama 一致性哈希,增删节点只有少量 key 迁移,缓存场景首选 典型:按 url 哈希(url_hash)、按 cookie 哈希、按参数哈希

# 按url一致性哈希,适合缓存服务
upstream backend {
    hash $request_uri consistent;
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}

Nginx Plus 商业版额外支持:least_time(最低响应时延)、random(二选一随机,power of two)

三、第三方模块策略(需要编译,面试常问)

  1. fair(ngx_http_upstream_fair_module):按后端响应时间,响应快的优先分配,动态感知后端压力;开源 nginx 不带。

  2. url_hash:老第三方模块,等价于上面 hash $request_uri consistent,现在原生 hash 已经替代它。

四、选型对比表

策略

会话保持

优点

缺点

适用场景

默认轮询

❌

简单均衡

不区分机器性能

同配置无状态服务

加权轮询

❌

适配异构机器

不看实时负载

机器性能不一样

least_conn

❌

按连接负载分配

无法感知 CPU/IO

长请求、慢任务

ip_hash

✅

原生 session 粘滞

NAT 场景失效、扩容抖动

简单会话保持(不推荐生产优先,更好用 redis 共享 session)

consistent hash

可自定义 key

扩容漂移少

复杂一点

缓存集群、CDN、redis 代理

五、生产最佳实践提醒

  1. 尽量不要依赖 ip_hash 做会话保持,优先应用层 session 共享(Redis);

  2. 缓存集群一定用 hash $request_uri consistent;;

  3. 加上健康检查参数 max_fails / fail_timeout;

  4. 后端开启长连接:keepalive 64; 在 upstream 内,减少 tcp 握手开销;

  5. 区分四层 stream 负载均衡(TCP/UDP)和七层 http 负载均衡,策略指令基本一致。

六、验证命令

nginx -t       # 校验配置
nginx -s reload # 平滑加载

本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。

原文链接 https://www.yijunzhao.cn/archives/nginx-load-balancing-principles-common-strategies

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/