bigywater.tech
Flask · 174

Nginx 反向代理

nginx 做负载均衡与故障转移时,后端挂了会怎样?GET 和 POST 的重试有什么区别?健康检查是怎么发现问题的?这篇用真实的两个后端把每种情形跑出来(HTTPS 与代理头见第 134、135 篇)。

30:10
weight=3 比 1 时 40 个请求在两个后端的分布
失败 0
一个后端挂了、默认重试配置下 40 个请求的失败数
3 个 504
后端卡住时 POST 不被重试而直接超时的请求数(6 个里)

负载均衡

实测 · 本机执行输出
  分布: {'A': 20, 'B': 20}
  weight=3 比 1: {'A': 30, 'B': 10}

上一篇:uWSGI 与 Flask;下一篇:ProxyFix 的作用。

nginx 是自己起的实例(非默认端口),后端是两个 gunicorn gthread 进程。

后端挂了

实测 · 本机执行输出
  B 停掉后 40 个请求:成功 40,失败 0;落在 {'A': 40}
  nginx 的 error.log 里记录了连接被拒: True (出现次数 1 )
  proxy_next_upstream off 时 40 个请求:成功 39,失败 1(落到挂掉后端的请求直接 502)

后端卡住

实测 · 本机执行输出
  GET   6 个请求:状态 {200: 6},最慢 1015 ms,成功的落在 {'A': 6}
  POST  6 个请求:状态 {504: 3, 200: 3},最慢 1004 ms,成功的落在 {'A': 3}

这一节的 nginx 配置里设了 max_fails=0,不把后端标记为不可用,每个请求都会轮到卡住的那个。

分步演示

Nginx 反向代理
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动。nginx 1.31.6、gunicorn gthread
    • 没有验证:nginx Plus 的主动健康检查、upstream keepalive 连接复用的效果、proxy_next_upstream_tries 与 proxy_next_upstream_timeout、least_conn 与 ip_hash 等其它负载均衡算法、nginx 重载配置时的连接处理
    京ICP备2026067502号-1京公网安备11010502063487号