要真正提升Nginx代理gRPC的高并发性能,关键在于HTTP/2、TCP层与upstream三者连接复用机制严丝合缝:必须用grpc_pass替代proxy_pass,启用grpc_socket_keepalive on,upstream使用grpc://前缀,禁用干扰HTTP/2的header操作,并调优worker、内核参数及连接生命周期,最后通过ss、抓包和后端日志交叉验证复用效果。

要真正提升 Nginx 代理后端 RPC(尤其是 gRPC)的高并发性能,关键不是堆配置,而是让连接复用机制在 HTTP/2、TCP 层和 upstream 管理三者间严丝合缝。gRPC 默认走 HTTP/2,不支持传统 HTTP/1.1 的 keepalive 复用逻辑,必须切换到对应协议栈并启用 socket 级长连接。
必须启用 gRPC 专用连接保持机制
HTTP/1.x 的 proxy_http_version 1.1 和 keepalive 对 gRPC 完全无效。正确做法是:
- 使用
grpc_pass指令替代proxy_pass,明确标识协议语义 - 在 location 块中开启
grpc_socket_keepalive on;—— 这才是真正控制底层 TCP socket 复用的开关 - 确保 upstream server 地址以
grpc://协议前缀声明,例如:server grpc://10.0.1.20:50051; - 禁用所有干扰 HTTP/2 流控的 proxy_header 操作,如避免手动设置
Connection或Upgrade头
HTTP/2 与 worker 协同调优
gRPC 依赖 HTTP/2 多路复用能力,单连接承载多请求,因此对 worker 并发模型更敏感:
- 保持
worker_processes auto;,但务必配合worker_cpu_affinity绑定核心,减少跨核缓存失效 -
worker_connections建议设为 16384 以上(非 1024),因为每个 gRPC stream 占用独立逻辑流,但共享一个 TCP 连接,实际连接数远低于并发请求数 - 启用
multi_accept on;,让每个 worker 在一次 epoll 事件中批量接受多个新连接,降低唤醒延迟 - 确认 nginx 编译时已启用
--with-http_v2_module,且未被 Docker 镜像或 Proxy Manager 覆盖禁用
内核与连接生命周期双控
gRPC 长连接易受系统级连接回收策略影响,尤其在客户端频繁重连或服务端滚动更新时:
- 调大内核参数:
net.core.somaxconn = 65535、net.ipv4.tcp_max_syn_backlog = 65535,防止 listen 队列溢出丢包 - 允许 TIME-WAIT 端口快速复用:
net.ipv4.tcp_tw_reuse = 1(仅对 Nginx 主动发起的出向连接生效) - 后端 gRPC 服务需设置合理的 keepalive 参数,例如 Go 的
KeepAliveParams中Time: 30s、Timeout: 10s,Nginx 的grpc_socket_keepalive才能稳定维持连接 - 避免在中间链路(如 K8s Service iptables 模式、云厂商 SLB)插入 Connection: close 或强制断连逻辑
验证是否真实复用而非“假长连”
光看配置没用,得从三个层面交叉验证:
- 用
ss -tan state established | grep :50051 | wc -l查看 Nginx 到后端的真实 ESTABLISHED 连接数——高并发下应显著低于 QPS,比如 1 万 QPS 对应 20–50 个连接即属正常 - 抓包分析:连续 gRPC 请求应复用同一源端口+目标端口对,且无重复 SYN 包
- 检查后端日志中连接建立频率;若每秒新建连接数 ≈ QPS,则说明复用完全失效,需回溯 grpc_socket_keepalive 和协议前缀配置



















