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,后端(上游服务)走 HTTP/1.1。这是标准且稳定的做法,无需降级或协议转换。
配置 HTTPS + HTTP/2 前端监听
确保 Nginx 启用 TLS 并显式开启 HTTP/2:
-
listen 443 ssl http2;是关键,必须带http2参数 - 配置有效的 SSL 证书(
.crt和.key),HTTP/2 在 Nginx 中强制要求 TLS - 推荐启用现代 TLS 设置(如
ssl_protocols TLSv1.2 TLSv1.3;)
显式指定后端使用 HTTP/1.1
Nginx 默认就用 HTTP/1.1 与后端通信,但建议显式声明以避免歧义:
-
proxy_http_version 1.1; - 加上
proxy_set_header Connection "";清除 Connection 头,防止 HTTP/1.1 的 keepalive 控制头干扰 - 若后端支持长连接,可配
proxy_http_version 1.1;+proxy_set_header Connection "keep-alive";(非必需,按需)
必要的请求头透传
保持客户端原始信息,尤其对鉴权、重定向、协议感知很重要:
-
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;(让后端知道原始是 https)
示例完整 server 块
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
location / {
proxy_pass http://backend:8080; # 后端用 HTTP/1.1,明文或本地更安全
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
}
}
注意:后端服务不需要支持 HTTP/2;只要它能响应 HTTP/1.1 请求即可。Nginx 会自动处理前后端协议协商,你只需分别配置好两端的协议偏好。











