要在 Nginx 中真正发挥 HTTP/2 的头部压缩与多路复用能力,必须打通“浏览器→Nginx→后端”全链路 HTTP/2 支持,配置 listen 443 ssl http2、proxy_pass https:// + proxy_http_version 2.0、upstream keepalive,并禁用域名分片等 HTTP/1.1 优化习惯。

要在 Nginx 中真正发挥 HTTP/2 的头部压缩与多路复用能力,不能只加个 http2 标志就完事。核心是让整条链路——从浏览器到 Nginx,再到后端服务——都支持并稳定复用 HTTP/2 连接,同时避免 HTTP/1.1 时代遗留的优化反效果。
启用 HTTPS 并正确开启 HTTP/2 监听
HTTP/2 在主流浏览器中强制要求 TLS,且必须通过 ALPN 协商启用:
- 确保使用有效证书(自签名在多数生产环境不被信任)
- Nginx 配置中 必须显式写出
listen 443 ssl http2;和listen [::]:443 ssl http2;,仅写ssl不会启用 HTTP/2 - 推荐启用 TLS 1.2+ 和现代 cipher suite,例如:
ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...;
配置头部压缩(HPACK)相关行为
HTTP/2 的头部压缩由协议层自动完成,Nginx 不需要额外开启开关,但需避免干扰其机制:
- 禁用人为添加或覆盖关键连接头,例如不要设
proxy_set_header Connection keep-alive,应设为''(空字符串) - 若做反向代理,务必清除升级头:
proxy_set_header Upgrade '';,否则可能触发错误降级 - 前端避免用 URL 参数(如
?v=20260829)高频变动资源路径,这会破坏 HPACK 的静态/动态表复用效率
激活多路复用并保障连接复用深度
多路复用依赖长连接和后端支持,单靠前端走 HTTP/2 不足以减少等待时间:
- 后端
proxy_pass必须指向https://地址,并显式声明:proxy_http_version 2.0;proxy_set_header Connection '';proxy_set_header Upgrade ''; - 在
upstream块中启用连接池:keepalive 32;(建议值 16–64,兼顾复用率与后端负载) - 停用域名分片(domain sharding):多个子域会强制建立多条独立连接,无法共享 stream 上下文,反而抵消多路复用优势
静态资源交付适配多路复用特性
HTTP/2 更适合“小而多”的资源模式,交付策略要转向轻量+长效:
- 启用 Brotli 压缩(优于 gzip):
brotli on;brotli_types text/css application/javascript text/html image/svg+xml; - 对不变资源设置强缓存:
expires 1y;add_header Cache-Control "public, immutable"; - 不对已压缩格式(JPEG、PNG、woff2)再启用 gzip/brotli,节省 CPU,把连接资源留给更多并发 stream


















