必须在 HTTPS server 块中配置 listen 443 ssl http2,配齐有效证书、TLSv1.2+ 协议及 ALPN 支持;HTTP/2 仅工作于加密通道,明文 h2c 不被主流浏览器支持,且需调优 TLS 与 HTTP/2 专属参数以保障多路复用实效。
在 Nginx 的 server 块中正确开启 HTTP/2,核心不是“加个参数就行”,而是满足前提、配齐依赖、避免降级。只要 HTTPS 基础不牢,http2 参数就形同虚设。
主流浏览器(Chrome、Firefox、Safari)只支持加密通道下的 HTTP/2(即 h2),不支持明文 h2c。所以:
ssl 和 http2,推荐写法:listen 443 ssl http2;(顺序不影响,但语义更清晰)ssl_certificate(含 fullchain.pem)和 ssl_certificate_key
http2,它只走 HTTP/1.1;可单独配置 301 跳转到 HTTPSHTTP/2 性能高度依赖 TLS 握手效率和安全性,老旧或低效的 TLS 设置会让连接变慢甚至失败:
ssl_protocols TLSv1.2 TLSv1.3;(禁用 TLSv1.0/TLSv1.1 和 SSLv3)ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384;
ssl_stapling on; ssl_stapling_verify on;(需配 ssl_trusted_certificate)ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h;
默认值适合一般站点,但遇到大 Header、高并发或富前端场景时容易触发限制:
http2_max_field_size 16k;(默认 4k):应对长 JWT Token 或分布式追踪头(如 traceparent)http2_max_header_size 64k;(默认 16k):防止因 Cookie 或自定义头过多导致 431 错误http2_max_requests 5000;(默认 1000):提升连接复用率,减少 TLS 握手开销http2_max_concurrent_streams 256;(默认 128):允许单连接承载更多并行流,适合资源密集型页面HTTP/2 的多路复用优势,需要底层 TCP 和 Nginx 连接管理配合才能真正释放:
keepalive_timeout 300;(建议 60–300 秒):与客户端 keep-alive 策略对齐,避免过早断连keepalive_requests 10000;:配合 http2_max_requests,延长连接生命周期sendfile on; tcp_nopush on; tcp_nodelay on;
gzip on; 并精确设置 gzip_types,避免对图片等二进制内容重复压缩