要让 nginx 稳定分发 grpc 流量,必须启用 https+http/2、使用 upstream + grpc_pass、禁用缓冲、调优超时、启用 keepalive 和 least_conn 负载均衡,并配置健康检查。

要让 Nginx 稳定分发 gRPC 流量到微服务集群,不能套用 HTTP 反向代理模板,必须围绕 grpc_pass 构建适配 HTTP/2 和长连接流式通信的整套配置。漏掉关键项(如 HTTP/2 启用、缓冲禁用、连接复用)会导致 426、502 或 “Stream removed” 错误。
必须启用 HTTPS + HTTP/2
gRPC 严格依赖 HTTP/2,而 Nginx 仅在 TLS 加密的监听中才允许启用 http2:
-
server 块监听语句必须含
ssl http2,例如:listen 443 ssl http2; - 配置有效证书:
ssl_certificate和ssl_certificate_key指向 PEM 文件 - 禁用老旧协议:
ssl_protocols TLSv1.2 TLSv1.3;,避免协商失败 - Nginx 1.25+ 版本需单独写
http2 on;在 server 块内,不可塞进 listen 指令
正确使用 upstream + grpc_pass 组合
gRPC 不支持直接 proxy_pass,必须通过 upstream 定义后端集群,再由 grpc_pass 引用:
- upstream 中定义多个微服务实例,例如:
upstream grpc_backend { server 192.168.1.10:50051; server 192.168.1.11:50051; } - location 中使用
grpc_pass grpc://grpc_backend;(明文)或grpc_pass grpcs://grpc_backend;(加密) -
grpc://前缀可省略,但grpcs://不可省,否则降级为明文,导致 TLS 握手失败 - 若后端也启用 TLS,需配合
grpc_ssl_verify off;(测试)或完整证书链(生产)
调优超时、禁用缓冲、启用连接复用
gRPC 是双向长连接,Nginx 默认参数会截断流或主动断连:
- 关闭内部缓冲:
grpc_buffering off;,防止粘包、延迟或状态错乱 - 延长读写超时:
grpc_read_timeout 3600;、grpc_send_timeout 3600;(单位秒),适应空闲流或大 trace 数据 - 上游启用 keepalive:
keepalive 32;(每个 worker 对每台后端最多缓存 32 个空闲连接) - 配套清理头信息:
proxy_http_version 1.1;、proxy_set_header Connection '';
选用 least_conn 负载算法并启用健康检查
gRPC 客户端普遍复用少量长连接并发大量 stream,IP 哈希或轮询极易造成连接倾斜:
- upstream 中启用
least_conn;,按实时活跃连接数分发,更适合流式负载 - 禁用
ip_hash和hash $remote_addr类指令,除非明确需要会话粘性且已确认客户端行为可控 - 配置健康检查:
max_fails=3 fail_timeout=30s;,快速剔除故障节点 - 可选:添加
reset_timedout_connection off;,防止 Nginx 主动 kill “看似空闲”的活跃流











