Nginx配置网站HTTP/2,提升页面加载速度
想让网站在浏览器里加载更快,HTTP/2 是成本最低的优化项之一。
它允许同一个连接并行传输多个资源,减少握手和队头阻塞,对图片、CSS、JS 较多的站点提升明显。
下面按零基础也能照做的顺序,讲清 Nginx 配置 HTTP/2 的完整流程和验证方法。
开始前的两个硬性条件
HTTP/2 在主流浏览器中基本只在 HTTPS 下启用,所以你需要先有可用的 SSL 证书。
如果没有证书,可以先用 Let's Encrypt 免费签发,或在宝塔面板中一键申请。
准备清单:
- 一台已安装 Nginx 的服务器,能通过 SSH 登录
- 已解析到服务器的域名
- 有效的 SSL 证书文件(
.crt或.pem)和私钥文件(.key) - 服务器防火墙放行 443 端口
检查 Nginx 是否支持 HTTP/2,执行:
nginx -V 2>&1 | grep -o with-http_v2_module
输出 with-http_v2_module 说明支持。
如果没有输出,需要重新编译 Nginx 或改用官方预编译包。
修改 Nginx 站点配置开启 HTTP/2
找到你的站点配置文件,常见路径是 /etc/nginx/conf.d/你的域名.conf 或 /etc/nginx/sites-available/你的域名。
宝塔面板用户可以在“网站”->“设置”->“配置文件”中直接编辑。
把原来的 443 监听改成下面这样:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
root /var/www/html;
index index.html;
}
关键点:listen 443 ssl http2; 里的 http2 就是开启开关。
如果你用的是较新的 Nginx 版本,也可以写成 listen 443 ssl; 再加一行 http2 on;,具体以官方文档和本机 nginx -v 版本为准。
保存后先测试配置语法:
nginx -t
看到 syntax is ok 和 test is successful 再重载:
systemctl reload nginx
容易踩坑的几个地方
只改 HTTP 站点不生效。 如果你只写了 listen 80;,浏览器仍走 HTTP/1.1。
必须确保访问的是 https:// 地址。
证书链不完整。 只配置域名证书、缺少中间证书时,部分浏览器会直接拒绝连接。
建议使用 fullchain.pem 这类包含完整链路的文件。
旧版 Nginx 写法不同。 早期版本只支持 listen 443 ssl http2;,新版本推荐 http2 on;。
两种写法混用可能报错,改完务必用 nginx -t 检查。
CDN 会改变结果。 如果网站前面套了 CDN,浏览器看到的是 CDN 节点的协议版本。
需要在 CDN 控制台也开启 HTTP/2,否则源站开了也没用。
怎么确认 HTTP/2 真的生效了
方法一:浏览器打开网站,按 F12 进入“网络”面板,右键表头勾选“协议”。
刷新页面后看 Protocol 列,显示 h2 就是 HTTP/2,显示 http/1.1 说明还没生效。
方法二:命令行验证:
curl -I --http2 https://你的域名
返回结果第一行包含 HTTP/2 200 即表示成功。
如果返回 HTTP/1.1,回到上一步检查配置和重载是否完成。
开启 HTTP/2 后,页面资源加载的并发能力会提升,尤其对同域名下大量小文件的站点效果更直接。
但它不是万能药,图片压缩、缓存策略、CDN 仍然要配合使用。
常见疑问
HTTP/2 需要改网站代码吗? 不需要。
它工作在传输层,对 HTML、CSS、JS 都是透明的,配置完成后浏览器自动协商。
开了 HTTP/2 还要开 HTTP/3 吗? 两者不冲突。
HTTP/3 基于 QUIC,在弱网环境下可能更好,但需要 Nginx 编译支持或使用 CDN,建议先稳定运行 HTTP/2 再考虑。
为什么 nginx -t 报错 unknown directive "http2"? 说明当前 Nginx 版本不支持该写法,
可以改回 listen 443 ssl http2;,
或升级 Nginx 到支持新语法的版本。
配置后网站打不开怎么办? 先执行 nginx -t 看语法,再检查 443 端口是否被防火墙拦截,最后确认证书路径和权限是否正确。
回滚配置后重载即可恢复。