nginx开启http/2需满足https前提、版本与模块支持、正确listen指令(含ssl和http2)、现代tls配置及验证生效;它通过多路复用和头部压缩优化多资源并发加载,尤其提升含大量小文件的现代网页性能。

要在 Nginx 中开启 HTTP/2 并真正提升网页加载速度,关键不是加个参数就完事,而是确保 HTTPS 基础扎实、协议配置准确、TLS 协商高效。HTTP/2 本身不加速单个资源下载,它通过多路复用、头部压缩等机制减少并发请求的排队和延迟,尤其对含大量小文件(JS/CSS/图标)的现代网页和移动端访问效果显著。
确认运行环境满足硬性要求
HTTP/2 不是开关式功能,依赖底层支持:
- Nginx 版本 ≥ 1.9.5(推荐 1.20+ 或最新稳定版),且编译时启用了 http_v2_module 和 http_ssl_module
- OpenSSL ≥ 1.0.2e(强烈建议 1.1.1 或 3.0+,以支持 TLSv1.3 和更优性能)
- 执行
nginx -V 2>&1 | grep http_v2_module,有输出才表示模块已启用 - 执行
openssl version,确认版本达标且非系统自带过旧版本(如 CentOS 7 默认 OpenSSL 1.0.2k 可用,但 Ubuntu 18.04 默认 1.1.1 可直接用)
HTTPS 是前提,证书必须有效且完整
所有主流浏览器(包括 Chrome、Safari、Firefox 的移动端)仅在加密连接下启用 HTTP/2。明文 HTTP/2(h2c)不被支持。
- 使用 Let’s Encrypt 免费证书最稳妥:
certbot --nginx -d example.com,自动配置并续期 -
ssl_certificate必须指向 fullchain.pem(含站点证书 + 中间证书),不能只放cert.pem -
ssl_certificate_key指向私钥文件,权限设为600(chmod 600) - 浏览器访问
https://example.com地址栏应显示锁形图标,无“不安全”或证书警告
正确配置 listen 指令与 TLS 参数
这是最容易出错的一环:HTTP/2 必须与 ssl 同时出现在一条 listen 指令中。
- ✅ 正确写法:
listen 443 ssl http2;或listen 443 http2 ssl;(顺序无关) - ❌ 错误写法:
listen 443 ssl;和listen 443 http2;分成两条——Nginx 不报错,但客户端仍走 HTTP/1.1 - 启用现代 TLS:
ssl_protocols TLSv1.2 TLSv1.3;,禁用 TLSv1.0/TLSv1.1 - 优化握手效率:
ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h; - 开启 OCSP Stapling:
ssl_stapling on; ssl_stapling_verify on;,并配好ssl_trusted_certificate
验证是否生效并配合基础优化
配置后必须验证,再叠加轻量级提速手段:
- 重载配置:
sudo nginx -t && sudo nginx -s reload - Chrome DevTools → Network 标签 → 刷新页面 → 查看任意请求的 Protocol 列是否显示
h2 - 命令行验证:
curl -I --http2 https://example.com,返回头中含HTTP/2 200 - 启用 Brotli 压缩(优于 Gzip):
brotli on; brotli_types text/plain text/css application/javascript image/svg+xml; - 添加 HSTS 头跳过首次重定向:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;











