必须启用HTTPS+HTTP/2并使用grpc_pass指令,禁用缓冲、调优超时,否则会触发426或502错误;明文h2c不推荐,需listen 443 ssl http2、有效证书、grpc_buffering off、grpc_read_timeout 3600等。

要用 Nginx 做 gRPC 通信网关,核心不是把它当普通 HTTP 反向代理用,而是围绕 grpc_pass 构建一套适配 HTTP/2 和流式语义的配置体系。漏掉任一关键项——比如没开 HTTP/2、用了 proxy_pass、忘了关缓冲——就会触发 426、502 或 “Stream removed” 错误。
必须启用 HTTPS + HTTP/2 监听
gRPC 强制依赖 HTTP/2,而 Nginx 只允许在 TLS 加密的监听中启用 http2(明文 h2c 在生产中不推荐,客户端兼容性差):
-
listen 443 ssl http2;——http2必须写在listen指令里(Nginx 1.25+ 要求单独写http2 on;在 server 块内) - 配置有效证书:
ssl_certificate和ssl_certificate_key指向 PEM 文件 - 禁用老旧协议:
ssl_protocols TLSv1.2 TLSv1.3;,避免协商失败
正确使用 grpc_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://grpc_backend;
关闭缓冲并调优长连接超时
gRPC 是双向流、长连接模型,Nginx 默认行为会截断响应或主动断连:
- 禁用内部缓冲:
grpc_buffering off;—— 防止粘包、延迟或状态错乱 - 延长读写超时:
grpc_read_timeout 3600;和grpc_send_timeout 3600;(单位秒),适应空闲流或大文件传输 - 复用连接池:
upstream块中加keepalive 2000;和keepalive_timeout 75s;,显著减少 TIME_WAIT
验证与调试要点
别用 curl 测试——它不理解 gRPC 的二进制帧和 HTTP/2 语义:
- 用真实工具验证:
grpcurl -insecure -plaintext your-domain.com:443 package.Service/Method - 紧盯
error.log:搜索upstream rejected request、connection reset by peer、no live upstreams - 确认后端监听地址是
0.0.0.0:50051(而非仅127.0.0.1),尤其在 Docker 或 Windows 环境下











