找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

342

积分

0

好友

46

主题
发表于 22 小时前 | 查看: 6| 回复: 0

本文将通过实践详细讲解 Nginx 默认的加权轮询 (Round-Robin) 负载均衡算法,验证权重、失败超时等参数对上游服务器选择的影响,以及上游服务器恢复后的处理机制。

实验目的

利用 Nginx 反向代理验证加权的轮询 (Round-Robin) 负载均衡算法。

图片

实验步骤

步骤 01. 创建两个测试服务器 在 10.20.172.214 主机上创建两个监听不同端口的服务,在 10.20.172.213 主机上创建一个服务,用于模拟上游服务器集群。

# 编辑主配置文件,添加 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 反向代理配置文件,定义上游服务器组 backend 并设置不同的权重、失败策略和连接数限制。这是实现高可用架构的关键步骤,相关的最佳实践可以在数据库/中间件板块找到更多深入讨论。

tee /usr/local/nginx/conf.d/proxy_server_rr.conf <<'EOF'
# 创建上游服务器
upstream backend {
  server 127.0.0.1:8011 weight=2;  # 权重为2,轮流请求两次。
  server 127.0.0.1:8012 weight=1;  # 权重为1,轮流请求一次。
  server 10.20.172.213:8010 max_fails=2 fail_timeout=10s max_conns=5; # 最大失败次数为2,暂停10秒不向其转发请求。
  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;
    # 保持 http 长连接,避免每次请求都重新建立 TCP 连接。
    proxy_set_header Connection "";
    proxy_http_version 1.1;
    # 设置超时时间,避免上游服务器无响应导致客户端等待过久。
    proxy_read_timeout 10s;
    proxy_connect_timeout 10s;
  }
}
EOF

步骤 03. 验证加权轮询效果 重启 Nginx 并模拟客户端请求,观察请求按照权重分配的情况。

# 重启
nginx -s reload

# 模拟客户端请求
for i in $(seq 1 11);do
echo -n "第 $i 次请求: ";
curl http://test.weiyigeek.top;
done

# 首先,会轮流请求上游服务器,不受权重影响
第 1 次请求: From 8011 server response!  
第 2 次请求: From 8012 server response!
第 3 次请求: From 10.20.172.213:8010 server response!

# 其次,轮询完上游服务器后,便按照权重进行轮询。
第 4 次请求: From 8011 server response!  # 权重为 2 服务器会轮流请求两次。
第 5 次请求: From 8011 server response!
第 6 次请求: From 8012 server response!  # 权重为 1 的服务器轮流请求一次。
第 7 次请求: From 10.20.172.213:8010 server response! # 权重为 1 的服务器轮流请求一次。

# 周而复始
第 8 次请求: From 8011 server response!
第 9 次请求: From 8011 server response!
第 10 次请求: From 8012 server response!
第 11 次请求: From 10.20.172.213:8010 server response!

步骤 04. 测试故障转移与恢复 模拟上游服务器故障,验证 max_failsfail_timeout 参数的效果。这类故障检测与恢复机制是运维/DevOps工作中保障服务稳定的核心。

# 大致流程:
# 解释:2次失败后,暂停10秒不向其转发请求
# 10秒后,Nginx会再次尝试发送一个请求
# - 成功:恢复正常
# - 失败:再等10秒

# 模拟客户端请求
for i in $(seq 1 100);do
 echo -n "第 $i 次请求: ";
 curl http://test.weiyigeek.top;
 sleep 1;
done

# 在 213 主机上关闭开启 nginx 服务。
nginx -s stop

ad6a2ac168f234f4bd1003fa6993bd89.png weiyigeek.top-fail_timeout与max_fails配置使用效果图

步骤 05. 验证长连接机制 通过抓包验证 Nginx 与上游服务器之间建立的 keepalive 长连接,这对于减少TCP握手开销、提升性能至关重要,相关的网络优化知识可以在网络/系统板块深入学习。

# 214 主机
tcpdump -i lo port 8012

# 模拟请求直至请求成功到 214 主机的 8012 端口
curl http://test.weiyigeek.top;

ed217ca5716a76f58dc261d86d2a89c0.png weiyigeek.top-验证与上游服务器keepalive长连接图




上一篇:间接Shellcode执行:利用ReadProcessMemory写入原语绕过EDR检测
下一篇:Nginx负载均衡实战:ip_hash与hash算法实现会话保持与扩展
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区(YunPan.Plus) ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-6 23:54 , Processed in 0.067863 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 CloudStack.

快速回复 返回顶部 返回列表