nginx反向代理不转换http/2到http/1.1,而是前端用https+http/2、后端用http/1.1独立通信;需配置listen 443 ssl http2、proxy_http_version 1.1及proxy_set_header connection ""。

Nginx 反向代理本身不“转换”HTTP/2 到 HTTP/1.1,而是分别控制前端(客户端)和后端(上游)使用的协议版本。你真正需要的是:让客户端通过 HTTPS + HTTP/2 访问 Nginx,同时让 Nginx 以稳定兼容的 HTTP/1.1 协议与后端服务通信——这正是标准且推荐的做法。
✅ 明确协议分层:前端用 HTTP/2,后端用 HTTP/1.1
- 客户端 → Nginx:启用 HTTP/2(必须走 TLS,即 HTTPS)
-
Nginx → 后端:默认就是 HTTP/1.1,无需额外开启;显式配置
proxy_http_version 1.1更清晰可靠
Nginx 不会、也不应强行把 HTTP/2 “降级转换”给后端。它只是在两个独立连接上使用各自协商好的协议。
? 关键配置项(HTTPS + HTTP/2 前端 + HTTP/1.1 后端)
upstream my_backend {
server 127.0.0.1:8080;
keepalive 32; # 复用长连接,提升性能
}
server {
listen 443 ssl http2; # ← 启用 HTTP/2(需 SSL)
server_name example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
location / {
proxy_pass http://my_backend;
# 强制使用 HTTP/1.1 与后端通信(默认值,显式写出更稳妥)
proxy_http_version 1.1;
# 必须清除 Connection 头,避免 HTTP/1.0 兼容干扰
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;
proxy_set_header X-Forwarded-Proto $scheme;
# 可选:超时调优(防卡死)
proxy_connect_timeout 10s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
}
⚠️ 注意:
http2只写在listen指令里,不出现在proxy_http_version中;proxy_http_version 2.0仅在后端明确支持 h2(如 gRPC over HTTP/2 或启用了 h2c 的特殊服务)时才考虑,普通 Web 应用几乎不需要,且易出错;proxy_set_header Connection ""是关键,否则 Nginx 可能透传Connection: upgrade等头,导致后端误解为 WebSocket 或 HTTP/2 升级请求。
? 不要做的常见误区
- ❌ 在
proxy_pass后加http2://—— Nginx 不支持该 scheme,语法错误; - ❌ 为普通 REST API 后端配置
proxy_http_version 2.0—— 大多数 Spring Boot、Node.js、Django 默认不支持 h2 上游,会直接拒绝或返回 426; - ❌ 忽略
keepalive和Connection ""—— 可能引发连接复用失败或 502/504; - ❌ 把
http2写进location或upstream—— 无效且报错。
? 补充说明:gRPC 等特殊场景例外
如果你代理的是 gRPC 服务(基于 HTTP/2),则要用专用指令:
location /grpc/ {
grpc_pass grpc://my_grpc_backend; # ← 不是 proxy_pass
grpc_set_header Host $host;
}
此时后端必须启用 HTTP/2(通常为 h2c 或 https),且 Nginx 需编译支持 ngx_http_grpc_module(主流发行版默认包含)。
不复杂但容易忽略。











