要让Nginx稳定代理gRPC,必须启用HTTPS+HTTP/2、使用grpc_pass替代proxy_pass、禁用缓冲(grpc_buffering off)、延长超时(如grpc_read_timeout 3600)、复用连接(upstream中配置keepalive),否则易出现426、502或“Stream removed”错误。

要让 Nginx 稳定、高性能地代理 gRPC,不能套用 HTTP 反向代理的配置习惯,必须围绕 grpc_pass 构建适配 HTTP/2 和流式通信的整套机制。漏掉任一关键项,比如 HTTP/2 未启用、缓冲未关闭或连接未复用,就容易触发 426、502 或 “Stream removed” 错误。
必须启用 HTTPS + HTTP/2
gRPC 严格依赖 HTTP/2,而 Nginx 仅在启用 TLS 的 HTTPS 监听下才允许开启 HTTP/2(明文 h2c 不推荐用于生产):
-
监听配置需包含 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指令
必须使用 grpc_pass,而非 proxy_pass
grpc_pass 是专为 gRPC 设计的指令,它自动启用 HTTP/2 协议栈并透传二进制帧;proxy_pass 会强制降级为 HTTP/1.1,直接导致失败:
- 后端为明文 gRPC(如 Go 默认服务):
grpc_pass grpc://127.0.0.1:50051; - 后端启用 TLS(如双向认证):
grpc_pass grpcs://127.0.0.1:50051;,并配合grpc_ssl_verify off;(测试环境)或完整证书链(生产) - 如需负载均衡,先定义
upstream块,再在grpc_pass中引用,例如grpc_pass grpc://my_grpc_backend;
关闭缓冲并延长超时时间
gRPC 是长连接、双向流式通信,Nginx 默认的缓冲和短超时会截断响应或主动断连:
- 禁用内部缓冲:
grpc_buffering off;(防止粘包、延迟或状态错乱) - 延长读写超时:
grpc_read_timeout 3600;和grpc_send_timeout 3600;(单位秒,适应空闲流或大文件传输)
启用连接池复用减少 TIME_WAIT
默认情况下,Nginx 与后端 gRPC 服务之间不复用连接,压测易出现大量 TIME_WAIT,引发 “Stream removed”:
- 在
upstream块中配置:keepalive 2000;(最大空闲连接数)和keepalive_timeout 75s;(空闲超时) - 建议同时设
keepalive_requests 4294967295;(单连接最大请求数),避免过早关闭连接 - 若未定义
upstream,直接在location内使用grpc_pass时,该优化将失效



















