Nginx 负载均衡模块:
ngx_http_upstream_module,七层 HTTP 负载均衡;支持:轮询、加权轮询、ip_hash、least_conn、url_hash(第三方)。 文件:nginx.conf或者conf.d/upstream.conf
前置说明
upstream块定义后端服务器组,写在http {}内部,不能放在server{}健康检查:Nginx 原生只支持被动健康检查(失败多少次标记节点不可用);主动健康检查需要 Nginx Plus 或者第三方模块
后端节点状态标记:
down、backup、max_fails、fail_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
生产注意事项
Nginx 原生 upstream 被动健康检查:节点恢复后会自动重试;如果需要主动健康探测,需要 Nginx 商业版或者
ngx_http_upstream_check_module(淘宝开源模块,需要重新编译)四层 TCP 负载均衡(数据库、TCP 服务)要用
stream {}模块,和 http upstream 不一样,需要单独配置限流、熔断可以搭配
limit_req、limit_conn放在 LB 层保护后端集群
本文原创作者:易君召,详见:https://www.yijunzhao.cc/about,转载请注明出处。
原文链接
欢迎访问