haproxy 做 tcp/http 层负载均衡 + gunicorn 做应用层并发处理,是 python web 服务在生产环境最稳、最容易调优的组合;haproxy 必须启用 stream 模式代理 gunicorn 的 tcp 连接,gunicorn 的 worker 类型和参数需严格匹配业务特性,健康检查应采用 tcp 探活而非仅 http 状态码。

直接说结论:HAProxy 做 TCP/HTTP 层负载均衡 + Gunicorn 做应用层并发处理,是 Python Web 服务在生产环境最稳、最容易调优的组合。单纯靠 gunicorn 自身不能实现跨机器的请求分发,它只管本机进程调度;真正承担“把用户请求打到哪台服务器”职责的,必须是 HAProxy(或 Nginx stream)这类反向代理。
HAProxy 必须启用 stream 模式才能代理 Gunicorn
很多人配完 HAProxy 发现请求 502 或直接超时,根本原因是默认只处理 HTTP,而 Gunicorn 默认走的是纯 TCP 连接(--bind 0.0.0.0:8000)。HAProxy 要转发这类流量,必须显式启用 stream 模块并配置 frontend/backend 在 stream 上下文中:
-
stream块不能放在http块里,必须是顶级配置项,和global、defaults并列 - 监听端口需用
listen或frontend+backend组合,不能用location(那是 HTTP 模块的) - 后端 server 地址必须写成
127.0.0.1:8000这类明确的 IP+端口,不支持 Unix socket 路径(除非编译时启用了USE_LINUX_TPROXY)
典型错误配置:proxy_pass http://gunicorn_backend —— 这会触发 HTTP 解析,Gunicorn 不认,直接断连。
Gunicorn 的 --worker-class 和 --workers 必须匹配业务类型
选错 worker 类型会导致 CPU 白占、连接堆积甚至内存爆炸。不是所有场景都适合 gevent:
- CPU 密集型任务(如图像处理、数值计算)用
sync更稳,--workers设为$(nproc) + 1 - I/O 密集型(API、数据库查询、调外部 HTTP)才上
gevent,此时--workers可设小(如 2~4),但必须配--worker-connections=1000以上 - 混用
gevent和同步库(如某些未 patch 的 psycopg2、requests)会卡死事件循环,必须确认所有依赖都兼容 gevent
验证方式:启动后看 ps aux | grep gunicorn,如果只看到 master 进程没子进程,说明 --worker-class 加载失败,日志里通常有 ImportError。
HAProxy 健康检查必须用 TCP 探活,不能只靠 HTTP 状态码
Gunicorn 进程可能还活着,但内部协程已卡死、无法响应 HTTP 请求。仅靠 option httpchk GET /health 会误判:
- 推荐用
option tcp-check+tcp-check connect,只要端口能通就认为健康 - 加
tcp-check send和tcp-check expect做更细粒度探测(比如发一个 HTTP HEAD 请求并检查响应头) -
inter 3s fall 2 rise 3是合理起点:3 秒探一次,连续 2 次失败下线,连续 3 次成功上线
注意:Gunicorn 默认不监听 localhost 以外地址,HAProxy 在另一台机器上时,--bind 必须写成 0.0.0.0:8000,且防火墙放行该端口。
真实压测中容易被忽略的瓶颈点
跑出低 QPS 或高延迟,90% 不是配置问题,而是资源层没对齐:
- HAProxy 机器的
net.core.somaxconn和net.ipv4.ip_local_port_range未调大,导致新建连接失败(ss -s查failed计数) - Gunicorn 的
--timeout小于 HAProxy 的timeout server,导致 HAProxy 先断连,Gunicorn 还在等请求体 - 多个 Gunicorn 实例共用同一个
--pid文件路径,重启时互相覆盖,systemd 无法正确管理生命周期
最隐蔽的问题:HAProxy 默认开启 option http-server-close,它会复用后端连接,但 Gunicorn 的 keepalive 参数(如 --keep-alive)若设得太短,连接池频繁重建,反而拖慢吞吐。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











