小易说IT 小易说IT

Nginx 负载均衡完整配置示例

Nginx 负载均衡模块:ngx_http_upstream_module七层 HTTP 负载均衡;支持:轮询、加权轮询、ip_hash、least_conn、url_hash(第三方)。 文件:nginx.conf 或者 conf.d/upstream.conf

前置说明

  1. upstream 块定义后端服务器组,写在 http {} 内部,不能放在 server{}

  2. 健康检查:Nginx 原生只支持被动健康检查(失败多少次标记节点不可用);主动健康检查需要 Nginx Plus 或者第三方模块

  3. 后端节点状态标记:downbackupmax_failsfail_timeout

示例 1:加权轮询(最常用,默认策略)

后端机器性能不一致,推荐。不写 weight 默认权重 = 1

http {
    # 定义后端服务集群,名字叫 web_cluster
    upstream web_cluster {
        server 10.0.0.10:8080 weight=5 max_fails=3 fail_timeout=30s;
        server 10.0.0.11:8080 weight=3 max_fails=3 fail_timeout=30s;
        server 10.0.0.12:8080 weight=2 max_fails=3 fail_timeout=30s;
        # 备用节点,所有主节点挂了才启用
        server 10.0.0.13:8080 backup;
    }

    server {
        listen 80;
        server_name lb.example.com;

        location / {
            proxy_pass http://web_cluster; # 转发到upstream集群
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

参数解释:

  • weight=5:权重,数值越大流量越多

  • max_fails=3:3 次失败,判定节点不可用

  • fail_timeout=30s:失败后 30s 内不再尝试访问该节点,30s 后重试

  • backup:备用节点

示例 2:ip_hash(会话保持,同一客户端 IP 固定打到同一后端)

⚠️ 注意:ip_hash 下 weight 可以配置,但不能写 backup;NAT 出口场景容易负载不均;优先推荐 Redis 共享 session,少用 ip_hash

http {
    upstream web_cluster {
        ip_hash; # 开启ip_hash策略
        server 10.0.0.10:8080 max_fails=3 fail_timeout=30s;
        server 10.0.0.11:8080 max_fails=3 fail_timeout=30s;
        server 10.0.0.12:8080 max_fails=3 fail_timeout=30s;
    }

    server {
        listen 80;
        server_name lb.example.com;

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

示例 3:least_conn 最少连接策略(动态策略)

请求处理耗时差异大、长连接场景(WebSocket、文件上传)优先使用 优先转发给当前活跃连接数最少的后端,支持 weight 加权

http {
    upstream web_cluster {
        least_conn; # 开启最少连接
        server 10.0.0.10:8080 weight=5 max_fails=3 fail_timeout=30s;
        server 10.0.0.11:8080 weight=3 max_fails=3 fail_timeout=30s;
        server 10.0.0.12:8080 weight=2 max_fails=3 fail_timeout=30s;
    }

    server {
        listen 80;
        server_name lb.example.com;

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

示例 4:url_hash(第三方模块 ngx_http_upstream_hash_module)

按请求 URL 哈希,相同 URL 固定打到同一后端,适合静态资源缓存集群 ⚠️ 需要额外编译模块,原生 Nginx 不自带

http {
    upstream static_cluster {
        hash $request_uri; # 根据url哈希
        hash_method crc32;
        server 10.0.0.20:8080;
        server 10.0.0.21:8080;
        server 10.0.0.22:8080;
    }

    server {
        listen 80;
        server_name static.example.com;
        location / {
            proxy_pass http://static_cluster;
        }
    }
}

常用配套优化参数(加到 location 块)

location / {
    proxy_pass http://web_cluster;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    # 超时配置
    proxy_connect_timeout 10s;    # 和后端建立连接超时
    proxy_read_timeout 30s;       # 读取后端响应超时
    proxy_send_timeout 30s;       # 发送请求到后端超时

    # 缓冲区优化
    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;
}

验证命令

# 检查配置语法
nginx -t

# 平滑重载,不中断业务
nginx -s reload

生产注意事项

  1. Nginx 原生 upstream 被动健康检查:节点恢复后会自动重试;如果需要主动健康探测,需要 Nginx 商业版或者 ngx_http_upstream_check_module(淘宝开源模块,需要重新编译)

  2. 四层 TCP 负载均衡(数据库、TCP 服务)要用 stream {} 模块,和 http upstream 不一样,需要单独配置

  3. 限流、熔断可以搭配 limit_reqlimit_conn 放在 LB 层保护后端集群


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

原文链接 https://www.yijunzhao.cc/archives/nginx-load-balancing-complete-configuration-example

欢迎访问 https://www.yijunzhao.cc/

https://www.yijunzhao.cc/