nginx 做 grpc 负载均衡需满足版本≥1.13.10、启用http_v2和ssl模块、配置keepalive连接池、listen 443 ssl http2、grpc_pass grpc://、禁用缓冲及透传grpc头,并调优超时与关闭reset_timedout_connection。

Linux 下用 Nginx 做 gRPC 负载均衡,核心不是“能不能转发”,而是“能不能保流、不中断、不超时”。gRPC 依赖 HTTP/2 的多路复用和长连接特性,配置稍有偏差(比如漏掉 http2、后端没开 H2C、缓冲未关闭),就会出现 UNAVAILABLE、流被截断或连接频繁重建等问题。
确认 Nginx 具备 gRPC 代理能力
Nginx 必须同时满足三项硬性条件:
- 版本 ≥ 1.13.10(生产环境建议 ≥ 1.21.0)
- 编译时启用
--with-http_v2_module和--with-http_ssl_module - 运行时模块已加载:执行
nginx -V 2>&1 | grep -o http_v2应输出http_v2
若使用 Docker,推荐 nginx:alpine(v1.25+ 默认含 v2 模块);若源码编译,务必补全上述两个模块参数,否则 grpc_pass 指令不可用。
定义 upstream 并启用连接池
gRPC 客户端普遍复用长连接,Nginx 的 upstream 必须开启 keepalive,避免反复建连损耗:
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
-
keepalive 32:每个 worker 进程最多缓存 32 个空闲连接到后端 -
max_fails=3 fail_timeout=30s:连续失败 3 次,该节点摘除 30 秒 - 后端地址必须监听明文 HTTP/2(H2C),例如
10.0.2.10:8080,不能是仅支持 TLS 的 gRPC 端口
示例:
upstream grpc_backend {server 10.0.2.10:8080 max_fails=3 fail_timeout=30s;
server 10.0.2.11:8080 max_fails=3 fail_timeout=30s;
keepalive 32;
}
server 块严格匹配 gRPC 协议栈
客户端默认走 HTTPS + HTTP/2,Nginx 推荐终止 TLS 后以 HTTP/2 明文转发(最稳定、易调试):
-
listen 443 ssl http2:缺一不可,省略http2会降级为 HTTP/1.1,调用直接失败 -
ssl_certificate和ssl_certificate_key指向有效证书(测试可用自签名,但客户端需禁用校验) -
grpc_pass grpc://grpc_backend:协议前缀必须是grpc://,不是http:// -
grpc_buffering off:禁用缓冲,防止流式响应(如实时日志、监控推送)被截断 - 透传关键头:
grpc_set_header grpc-encoding $grpc_encoding;、grpc_set_header grpc-accept-encoding $grpc_accept_encoding;
适配双向流与负载算法
gRPC 双向流可能持续数分钟,需针对性调优:
-
grpc_connect_timeout 10s:建立初始连接允许耗时 -
grpc_send_timeout 300s:客户端两次发数据最大间隔(如心跳 45s,建议 ≥60s) -
grpc_read_timeout 300s:服务端响应或推送流的最大空闲时间 -
reset_timedout_connection off:必须关闭,否则 Nginx 会主动 kill “看似空闲”的活跃流 - 负载算法选
least_conn(按当前活跃连接数分发),别用ip_hash——gRPC 客户端连接池复用率高,IP 哈希会导致流量倾斜










