一、proxy_http_version 是什么?
定义: 设置 Nginx 向后端服务器转发请求时使用的 HTTP 协议版本
只有两个可选值:
nginx
proxy_http_version 1.0; # 默认
proxy_http_version 1.1; # 手动开启二、默认值:proxy_http_version 1.0(默认)
特点
- 短连接
- 每转发一次请求,就建立一次连接,请求结束立即关闭
- 不支持长连接、不支持 pipeline、不支持 WebSocket
行为
- 每次请求都会重新建立连接
- 每次都会触发 upstream 重新负载均衡(轮询)
- 不会粘住某一台后端
优点
- upstream 轮询 100% 生效
- 不会出现“只访问一台机器”的问题
缺点
- 频繁建连,性能稍差
三、手动开启:proxy_http_version 1.1
特点
- 支持长连接(keepalive)
- 支持 WebSocket(必须 1.1)
- 连接可以复用,不立即关闭
- 性能更高
关键后果(你最关心的)
长连接 = 连接复用 = 绑定第一次选中的后端节点 → 不再触发 upstream 轮询 → 表现为:永远访问一台机器
四、proxy_http_version 1.1 必须配合的配置(缺一不可)
开启 1.1 后,必须配合以下头部,否则会出问题:
1. 长连接模式(普通接口用)
nginx
proxy_http_version 1.1;
proxy_set_header Connection "";2. WebSocket 模式(必须这样写)
nginx
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";3. 想让长连接 不破坏轮询(必须加)
nginx
upstream backend {
server 94:18043;
server 95:18043;
keepalive 16; # 关键!管理连接池
}五、proxy_http_version 影响负载均衡的真正原理(官方客观)
1. 使用 1.0(默认)
- 每次请求 = 新连接
- 每次新连接 = 重新负载均衡
- 轮询一定生效
- 不会粘节点
2. 使用 1.1 + 长连接
- 第一次请求建立连接
- 后续请求复用该连接
- 复用连接 = 不会重新负载均衡
- 表现为:永远访问一台机器
六、proxy_http_version 最全配置总结表
| 配置 | 连接类型 | 是否破坏轮询 | 适用场景 |
|---|---|---|---|
proxy_http_version 1.0 | 短连接 | 不破坏,轮询正常 | 普通接口、需要负载均衡的API |
proxy_http_version 1.1 + Connection "" | 长连接 | 破坏(连接复用) | 高性能接口 |
proxy_http_version 1.1 + upgrade | WebSocket长连接 | 严重破坏 | WebSocket、实时通信 |
proxy_http_version 1.1 + upstream keepalive | 连接池 | 不破坏(均衡分发) | 生产级高性能负载均衡 |
七、最终官方结论(最客观)
proxy_http_version 1.0= 默认 = 短连接 = 负载均衡永远正常生效proxy_http_version 1.1= 长连接 = 连接复用 = 可能不轮询- 不是 upstream 坏了,是长连接导致不再重新选择节点
- WebSocket 必须用 1.1,所以一定粘节点
- 普通接口想保持轮询 → 不要开启 1.1