Nginx 透传 gRPC 需严格对齐 HTTP/2 生命周期:1. 启用 HTTPS+HTTP/2 并禁用旧协议;2. 用 grpc_pass + h2c/gRPC 明文后端;3. 关闭缓冲、延长流超时、禁用重置;4. 合理配置 keepalive 与被动健康检查。

1. 强制启用 HTTP/2 + TLS 终止(客户端侧)
gRPC 客户端默认要求 HTTPS + HTTP/2,Nginx 必须在 server 块中显式启用:
– listen 443 ssl http2;
– 配置有效证书(ssl_certificate / ssl_certificate_key);
– 禁用旧协议:ssl_protocols TLSv1.2 TLSv1.3;
– 不要用 listen 443 ssl; 漏掉 http2 —— 这会导致协商失败,降级为 HTTP/1.1,直接报 426。
2. 使用 grpc_pass + 明文 H2C 后端直连(服务端侧)
– 后端 gRPC 服务必须监听 HTTP/2 明文端口(如 :8080),开启 h2c 支持(Go 默认支持,Java 需显式配置);
– upstream 中定义后端用 grpc:// 协议前缀:
upstream grpc_backend {
server 10.0.1.10:8080;
server 10.0.1.11:8080;
keepalive 2000;
keepalive_timeout 75s;
}
– location 中必须用 grpc_pass grpc://grpc_backend;(不能用 proxy_pass);
– 若后端强制 TLS(如 mTLS),则改用 grpcs://,并配 grpc_ssl_verify off(测试)或完整证书链(生产)。
3. 关闭缓冲 + 调整流级超时(防截断、防误断)
gRPC 是长时流,Nginx 默认缓冲和短超时会破坏 stream 完整性:
– grpc_buffering off;(禁用内部缓冲,避免粘包与延迟);
– grpc_read_timeout 3600; 和 grpc_send_timeout 3600;(单位秒,适配空闲流、大文件或 token 流式生成);
– reset_timedout_connection off;(防止超时后主动 RST,中断仍在活跃的 stream);
– proxy_read_timeout 和 proxy_send_timeout 不生效于 grpc_pass,只认 grpc_*_timeout。
4. 连接池 + 健康策略匹配 gRPC 行为(稳态调度)
– keepalive 1000~2000(每个 worker 对每台后端缓存的空闲连接数),值过小引发大量 TIME_WAIT;
– keepalive_timeout 75s(显式设置,避免继承 proxy_timeout 的 60s 默认值,导致空闲但活跃的流被关闭);
– max_fails=3 fail_timeout=60s(被动健康检查节奏需匹配 gRPC 心跳,如客户端每 30s 发 PING,该配置允许两次丢 ping 后再摘除);
– 不要用 health_check 主动探测 —— gRPC 无标准 /health 端点,主动探活反而触发无效 stream 或失败;
– 负载算法用默认轮询(round-robin)即可,gRPC 天然多路复用,least_conn 对 stream 数不敏感,且 Go 客户端默认 pick_first,需在代码侧显式设 round_robin 才能生效。


















