大数跨境
0
0

Nginx | 负载均衡策略:最少连接算法实践

Nginx | 负载均衡策略:最少连接算法实践 全栈工程师修炼指南
2025-12-05
0
导读:本文讲解了Nginx负载均衡策略中最少连接算法它是一种动态的负载均衡策略,旨在将新的请求转发到当前活跃连接数最少的服务器上,zone指令将上游服务器状态信息连接数、权重、失败次数等,存放在共享内存中,

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]


📢 大家好,我是 WeiyiGeek一名深耕安全运维开发(SecOpsDev)领域的技术从业者,致力于探索DevOps与安全的融合(DevSecOps),自动化运维工具开发与实践,企业网络安全防护,欢迎各位道友一起学习交流、一起进步 🚀,若此文对你有帮助,一定记得点个关注⭐与小红星❤️或加入到作者知识星球『 全栈工程师修炼指南,转发收藏学习不迷路 😋 。

负载均衡策略:最少连接算法

描述:上一节中讲解实践了基于一致性哈希算法的负载均衡策略,以防止大规模的缓存失效问题。本节将介绍另一种负载均衡策略最少连接算法(Least Connections)它是一种动态的负载均衡策略,旨在将新的请求转发到当前活跃连接数最少的服务器上。它由 ngx_http_upstream_least_conn_module 模块提供已缺省编译进 Nginx, 若要禁用可通过 --without-http_upstream_least_conn_module 指令禁用。

在 Nginx 中使用最少连接算法时,通常会引入 ngx_http_upstream_zone_module 模块解决跨进程数据共享问题,由于所有负载均衡算法的状态信息默认存储在单个工作进程的内存中,无法在多进程间共享,所以 ngx_http_upstream_zone_module 模块将上游服务器状态信息(如连接数、权重、失败次数等)存放在共享内存中,实现多 worker 进程之间的状态同步,同样,该模块已经默认编译进 Nginx ,可通过 --without-upstream_zone_module 指令禁用。

值得注意的 zone 模块,在 *ngx_modules[] 数组中位于 ngx_http_upstream 最后,以确保其能将前面所有模块定义的状态信息统一迁移至共享内存中,实现了多个 worker 进程之间共享配置和负载均衡状态的能力,提升了集群一致性与可用性。

温馨提示:若文章代码块中存在乱码或不能复制,请联系作者,也可通过文末的阅读原文链接,加入知识星球中阅读,原文链接:https://articles.zsxq.com/id_a2l6pacq0flr.html

模块指令

# 基于请求传递给活动连接数最少的服务器,受到服务器的权重影响
Syntax: least_conn;
Default: —
Context: upstream

# 基于请求最小的平均响应时间和最少的活动连接数传递给服务器,受到服务器的权重影响
Syntax: least_time header | last_byte [inflight];
Default: —
Context: upstream
# 参数:
# header 表示使用响应头字段作为负载均衡的依据
# last_byte 表示使用最后一个字节的时间

# 定义共享内存区的名称和大小(单位:k/m),该共享内存区保留工作进程之间共享的组配置和运行时状态。
Syntax: zone name [size];
Default: —
Context: upstream

温馨提示:如果出现多个最少连接服务器的连接数相同时,则使用 round-robin 算法进行轮询选择。

操作步骤

步骤 01.创建两个测试服务器(213、214),213主机监听 8010 端口,214主机分别监听8011和8012端口。

# 编辑主配置文件,添加 include 指令,引入自定义配置文件目录。
vim /usr/local/nginx/conf/nginx.conf
....
include /usr/local/nginx/conf.d/*.conf;
....

# 创建测试服务器配置文件目录,并写入两个监听服务器的配置。
mkdir /usr/local/nginx/conf.d/
# 10.20.172.214 主机
tee /usr/local/nginx/conf.d/server.conf <<'EOF'
server {
  listen 8011;
  server_name localhost _;
  default_type text/plain;
return 200 'From 8011 server response!\n';
}

server {
  listen 8012;
  server_name localhost _;
  default_type text/plain;
return 200 'From 8012 server response!\n';
}
EOF

# 10.20.172.213 主机
tee /usr/local/nginx/conf.d/server.conf <<'EOF'
server {
  listen 8010;
  server_name localhost _;
  default_type text/plain;
return 200 'From 10.20.172.213:8011 server response!\n';
}
EOF

步骤 02.编辑 Nginx 主配置文件,反向代理请求时使 启用最少连接算法。

mv /usr/local/nginx/conf.d/proxy_server_hash.conf{,.bak}
tee /usr/local/nginx/conf.d/proxy_server_least_conn.conf <<'EOF'
# 创建上游服务器
upstream backend {
# 定义共享内存区,用于在工作进程间同步负载信息,可根据后端服务器数量调整。
  zone backend_zone 64k;

# 基于最少连接算法进行负载均衡。
  least_conn; 
# least_conn 负载均衡算法不受权重影响
  server 127.0.0.1:8011 weight=2; 
  server 127.0.0.1:8012;
# 最大失败次数为2,暂停10秒不向其转发请求。
  server 10.20.172.213:8010 max_fails=2 fail_timeout=10s max_conns=5;

  keepalive 10;  # 设置与上游服务器的长连接,最多保持10个空闲的保活连接。
  keepalive_timeout 60s; # 设置与上游服务器的长连接,空闲连接的超时时间。
}

# 创建监听用于反向代理
server {
  listen 80;
  server_name test.weiyigeek.top;
  access_log /var/log/nginx/test.log main;
  error_log test.error.log info;
  location / {
    proxy_pass http://backend;
    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 Connection "";
    proxy_http_version 1.1;
  }
}
EOF

步骤 03.重启 Nginx 服务,测试最少连接算法效果,由于加入了 keepalive 长连接参数,在测试过程中会发现连接数会在空闲时间内不会减少,直到空闲时间 60s 结束后才会释放。

# 多找几台主机模拟客户端请求。
for i in $(seq 1 30);do echo -n "user_WeiyiGeek${i}:";curl http://test.weiyigeek.top?user=WeiyiGeek${i};sleep 1;done

# 观察后端服务器连接数变化情况。
# 214 主机
netstat -ano| grep -E ":801[1-2]"

# 213 主机
ss -tano | grep ":8010"

weiyigeek.top-最少连接负载均衡算法效果图

知识扩展:在前面介绍 ngx_http_upstream_module 模块的文章中,提到过 upstream 模块的子模块是有执行顺序(从上到下的顺序依次执行)的,执行顺序直接影响最终的负载均衡行为;此外模块间联合使用时可能存在退化关系。

例如:先配置 round_robin ,再配置 least_conn 时,则可能退化为 round_robin 行为。

例如:若同时配置 hash 和 keepalive 时,keepalive 会缓存哈希结果,并在后续请求中直接复用已有连接。

温馨提示:由于文章篇幅限制,我将负载均衡相关模块反向代理相关模块配置使用分两篇文章进行讲解,下一篇,作者将着重介绍反向代理相关指令配置以及缓存优化配置等方面。

END

加入:作者【全栈工程师修炼指南】知识星球

『 全栈工程师修炼指南』星球,主要涉及全栈工程师(Full Stack Development)实践文章,持续更新包括但不限于企业SecDevOps和网络安全等保合规、安全渗透测试、编程开发、云原生(Cloud Native)、物联网工业控制(IOT)、人工智能Ai,从业书籍笔记,人生职场认识等方面资料或文章。


Q: 加入作者【全栈工程师修炼指南】星球后有啥好处?

✅ 将获得作者最新工作学习实践文章以及网盘资源。

✅ 将获得作者珍藏多年的全栈学习笔记(需连续两年及以上老星球友,也可单次购买)

✅ 将获得作者专门答疑学习交流群,解决在工作学习中的问题。

✅ 将获得作者远程支持(在作者能力范围内且合规)。


获取:作者工作学习全栈笔记

作者整理了10年的工作学习笔记(涉及网络、安全、运维、开发),需要学习实践笔记的看友,可添加作者微信或者回复【工作学习实践笔记】,当前价格¥299,除了获得从业笔记的同时还可进行问题答疑以及每月远程技术支持,希望大家多多支持,收获定大于付出!


 知识推荐 往期文章


    若文章对你有帮助,请将它转发给更多的看友,若有疑问的小伙伴,可在评论区留言你想法哟 💬

    【声明】内容源于网络
    0
    0
    全栈工程师修炼指南
    记录全栈工程师学习之路修炼心得,分享工作实践、网络安全、运维、编程、大数据、云原生、物联网、人工智能以及书籍笔记、人生职场感悟等相关高质量文章。 花开堪折直须折,莫待无花空折枝。 Blog:【https://weiyigeek.top】
    内容 589
    粉丝 0
    全栈工程师修炼指南 记录全栈工程师学习之路修炼心得,分享工作实践、网络安全、运维、编程、大数据、云原生、物联网、人工智能以及书籍笔记、人生职场感悟等相关高质量文章。 花开堪折直须折,莫待无花空折枝。 Blog:【https://weiyigeek.top】
    总阅读45
    粉丝0
    内容589