nginx需按后端协议类型差异化配置:http/1.1后端用keepalive+proxy_http_version 1.1+清空connection头;grpc必须用grpc_pass并启用ngx_http_grpc_module;websocket需proxy_set_header upgrade $http_upgrade与connection "upgrade";tcp类服务须用stream块转发。

关键不是让后端“适配 Nginx”,而是让 Nginx 明确知道该用什么协议、怎么传头、如何管理连接去对接不同中间件。HTTP/1.1、HTTP/2、gRPC、WebSocket、纯 TCP——每种协议的交互逻辑不同,Nginx 需要对应配置,不能一概 proxy_pass 了事。
对接标准 HTTP/1.1 后端(如 Spring Boot、Flask、Express)
这是最常见场景,Nginx 默认就走 HTTP/1.1,但需主动优化连接复用和头部透传:
- 在 upstream 块中启用连接池:加 keepalive 32;(数字按并发量调整),避免频繁建连
- 在 location 中固定协议版本:proxy_http_version 1.1;
- 清除 Connection 头防止干扰:proxy_set_header Connection "";
- 必须透传原始 Host 和真实 IP:proxy_set_header Host $host;、proxy_set_header X-Real-IP $remote_addr;、proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
对接 gRPC 后端(如 Go/Python 的 gRPC Server)
gRPC 是基于 HTTP/2 的二进制协议,不能用 proxy_pass,否则会解包失败或返回 404/502:
- 改用专用指令:grpc_pass grpc://127.0.0.1:50051;(注意协议前缀是 grpc://,不是 http://)
- 确保 Nginx 编译时启用了 ngx_http_grpc_module(主流包如 nginx-full 默认包含)
- 路径建议分离,例如统一走 /grpc/ 前缀,避免与普通 HTTP 混用
- 透传 Host 头:grpc_set_header Host $host;(不是 proxy_set_header)
对接 WebSocket 或 HTTP/2 流式服务
这类协议依赖长连接与 Upgrade 机制,Nginx 不处理业务帧,但必须正确透传控制头并保持连接不关闭:
- 显式允许升级:proxy_set_header Upgrade $http_upgrade;
- 重写 Connection 头为 upgrade:proxy_set_header Connection "upgrade";
- 仍需保留 HTTP/1.1 版本声明:proxy_http_version 1.1;(WebSocket 基于 HTTP/1.1 Upgrade)
- 若后端监听 h2c(HTTP/2 明文),且你确认其支持,才考虑 proxy_http_version 2.0;;否则默认 1.1 更稳
对接四层 TCP 服务(如 MySQL、Redis、MQTT Broker)
这些不是 HTTP 协议,Nginx 的 http {} 块完全无效,必须用 stream {} 块做字节流转发:
- 配置需放在 nginx.conf 顶层,与 http、events 同级
- 编译时必须含 --with-stream,否则启动报 “unknown directive stream”
- 示例:将公网 6379 转发到内网 Redis:stream { upstream redis_backend { server 192.168.1.100:6379; } server { listen 6379; proxy_pass redis_backend; } }
- 不解析内容,不设 header,也不支持 location 分流——纯端口或 IP 层转发











