开启HTTP/2需Nginx≥1.9.5且启用http_v2_module与ssl_module、OpenSSL≥1.0.2支持ALPN、有效TLS证书及listen 443 ssl http2配置;反向代理应保持HTTP/1.1;需调优并发参数并验证h2协议生效。

开启 http2 指令本身不会自动带来性能质变,真正起决定作用的是它所触发的全链路 HTTPS 协议升级与连接模型重构——多路复用、头部压缩、单连接承载全部请求,这些特性在客户端到 Nginx 这一跳彻底生效后,显著削减了 TLS 握手次数、排队延迟和 TCP 连接开销。
必须满足的硬性前提条件
HTTP/2 不是可选插件,而是依赖底层协同的协议层能力:
- Nginx 版本 ≥ 1.9.5(推荐 1.20+),且编译时启用
--with-http_v2_module和--with-http_ssl_module - OpenSSL ≥ 1.0.2(强烈建议 1.1.1+ 或 3.x),支持 ALPN 协议协商;可通过
nginx -V | grep http_v2与openssl version双重确认 - 系统内核支持 TCP 优化(如
net.ipv4.tcp_fastopen),对高并发短连接场景有实际收益 - 使用有效、可信的 TLS 证书(Let’s Encrypt 等主流 CA),自签名或链不完整会导致浏览器强制降级为 HTTP/1.1
HTTPS 监听配置必须一步到位
常见错误是把 ssl 和 http2 拆成两条 listen 指令。正确写法只有一条:
listen 443 ssl http2;
同时配套关键 SSL 设置:
- 启用 TLS 1.2 或 TLS 1.3:
ssl_protocols TLSv1.2 TLSv1.3; - 禁用弱套件:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:…(排除 RC4、SHA1、3DES) - 开启会话缓存:
ssl_session_cache shared:SSL:10m;(10MB 可缓存约 4 万个会话) - 建议启用 OCSP Stapling:
ssl_stapling on; ssl_stapling_verify on;
反向代理层保持 HTTP/1.1 更稳更高效
客户端到 Nginx 走 HTTP/2 已释放绝大部分性能红利;向上游服务强行启用 HTTP/2 反而容易引入风险:
- 多数后端(Spring Boot、Gunicorn、Tomcat)对代理模式下的 HTTP/2 支持不成熟,易出现流控制异常或连接挂起
- 内网延迟低,HTTP/1.1 + keepalive 连接池已足够高效;HTTP/2 的多路复用优势在局域网几乎不可测
- 应显式维持上游为 HTTP/1.1:
proxy_http_version 1.1;+proxy_set_header Connection ''; - 配合 upstream keepalive 提升复用率:
upstream backend { server 10.0.0.1:8443; keepalive 32; }
针对性调优释放真实并发能力
默认参数适合小流量,高并发需微调:
-
worker_processes auto;与worker_connections 10240;配合系统ulimit -n,避免连接数瓶颈 - 若业务含长 JWT 或自定义追踪头,调大头部限制:
http2_max_field_size 16k;http2_max_header_size 32k; - 控制并发流数防止资源耗尽:
http2_max_concurrent_streams 128;(默认 128,可根据后端吞吐调整) - 启用 HSTS 强制 HTTPS:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
验证是否真正生效,优先使用浏览器 DevTools 的 Network 标签页查看 Protocol 列是否显示 h2;命令行可用 curl -I --http2 https://your-domain.com 辅助确认。不复杂但容易忽略。



















