一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx 轮询算法中如何配置以实现对后端服务的优雅关机与流量平滑摘除

时间:2026-08-08 10:06:56 编辑:袖梨 来源:一聚教程网

轮询算法本身不感知状态,优雅关机和流量摘除依赖Nginx配置与后端协同:通过weight=0/down摘流、健康检查自动识别退出、draining参数保障请求完成、后端主动关闭新请求并等待连接归零。

轮询算法本身不感知状态,优雅关机和流量摘除靠的是 Nginx 配置机制与后端行为协同实现,不是轮询自己“变聪明”,而是通过权重控制、健康检查、连接管理与后端退出节奏四者对齐。

用 weight=0 或 down 主动摘流

这是最直接、零延迟生效的方式,适用于计划内下线:

  1. 在 upstream 块中将目标节点设为 weight=0,Nginx 立即停止分发新请求,已建立的连接仍可正常收发
  2. 对 ip_hash 场景更推荐使用 down(如 server 10.0.0.5:8080 down;),哈希计算自动跳过该节点,老连接不受影响
  3. 修改后执行 nginx -s reload 生效;若使用 nginx-upsync-module 或 OpenResty 的 resty.etcd,可免 reload 动态更新

配合健康检查自动识别退出意图

让 Nginx 在后端真正停机前就停止派发新请求,避免依赖人工操作:

  1. 启用 nginx_upstream_check_module(OpenResty 已内置,原生需编译),配置 HTTP 探活:

    check interval=3 rise=2 fall=3 timeout=1 type=http;

  2. 后端下线前主动将 /health/ready/actuator/health 接口返回 503 Service Unavailable,触发 fall 计数,连续失败后自动标记为不可用
  3. 搭配 proxy_next_upstream error timeout http_503;,确保打到异常节点的请求能立即重试其他健康节点

延长 draining 时间窗口,保障存量请求完成

摘流只是开始,真正零丢失取决于是否给后端留足处理时间:

  1. 设置 proxy_read_timeout 为业务最长响应时间(如 60–120 秒),防止 Nginx 提前中断后端正在处理的请求
  2. 开启 proxy_ignore_client_abort on,避免用户关闭页面导致 Nginx 中断后端仍在运行的任务
  3. 启用 proxy_http_version 1.1proxy_set_header Connection "keep-alive",支持连接复用;upstream 内添加 keepalive 32 减少重建压力

后端必须主动配合退出节奏

Nginx 是协调者,不是执行者。安全下线的最终判断权在后端:

  1. 收到 SIGTERM 后,立即关闭新请求入口:Spring Boot 可停 Tomcat connector;Netty 可 shutdown EventLoopGroup
  2. 保持已有连接可读写,不主动 close,等待活跃连接自然归零;可通过 stub_status 监控 Active connections 确认是否降为 0
  3. 确认无活跃连接后再终止进程;若用 systemd,建议配置 TimeoutStopSec=90 并在 ExecStop 中调用 nginx -s quit 协同

不复杂但容易忽略的是:Nginx reload 不会中断已有连接,但真正的“优雅”必须由后端自身 graceful shutdown 能力兜底。配置只是桥梁,协作才是关键。

热门栏目