nginx源码编译支持http/2需满足:nginx≥1.9.5、openssl≥1.0.2e(推荐1.1.1+)、显式启用--with-http_ssl_module和--with-http_v2_module,并指定--with-openssl路径;配置必须为listen 443 ssl http2,配合tlsv1.2+、有效证书及alpn协商,最后通过curl或浏览器network面板验证h2协议生效。

要让 Nginx 通过源码编译支持 HTTP/2,关键不是“加个参数就完事”,而是确保整个依赖链和配置全部到位。版本、模块、OpenSSL、TLS 协议、ALPN 协商,缺一不可。
确认基础环境满足硬性条件
HTTP/2 在 Nginx 中不是可选开关,它有明确的底层要求:
- Nginx 版本 ≥ 1.9.5(强烈建议用 1.20.2 或更新稳定版)
- OpenSSL 版本 ≥ 1.0.2e(推荐 1.1.1 或 3.x,旧系统如 CentOS 7 自带的 1.0.2k 可能勉强可用,但 1.0.1e 绝对不行)
- 必须启用 --with-http_ssl_module 和 --with-http_v2_module 两个模块,后者依赖前者
- 不能复用系统默认 OpenSSL 动态库——必须指定 --with-openssl= 指向你编译或安装的高版本 OpenSSL 源码路径
编译时正确传递参数
configure 命令必须显式包含必要模块和 OpenSSL 路径。常见两种情况:
如果你已手动编译安装 OpenSSL 到 /usr/local/ssl:
./configure \ --prefix=/usr/local/nginx \ --with-openssl=/usr/local/ssl \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_stub_status_module \ --with-http_gzip_static_module
如果系统 OpenSSL 已满足版本要求(openssl version 输出 ≥ 1.0.2e),可省略 --with-openssl=,但仍需保留其余模块参数:
./configure \ --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_stub_status_module
执行 make && make install 完成安装后,务必验证模块是否真被编译进去:
/usr/local/nginx/sbin/nginx -V 2>&1 | grep -o with-http_v2_module
输出应为 with-http_v2_module,不能为空或报错。
配置 HTTPS 站点并启用 HTTP/2
编译成功只是第一步。HTTP/2 必须走 HTTPS,且 listen 指令写法严格:
- 错误写法:
listen 443 http2;或listen 443 ssl;—— 都不会启用 HTTP/2 - 正确写法(IPv4):
listen 443 ssl http2; - 正确写法(IPv6):
listen [::]:443 ssl http2;
同时必须配齐以下 TLS 相关配置:
-
ssl_certificate和ssl_certificate_key:指向 PEM 格式证书和私钥,路径可读 -
ssl_protocols TLSv1.2 TLSv1.3;:禁用 TLSv1.0 和 TLSv1.1,否则 ALPN 协商可能跳过 - 不建议设置
ssl_ciphers过于激进,避免兼容性问题;默认值通常已足够
验证是否真正生效
reload 配置成功 ≠ HTTP/2 已跑通。ALPN 协商失败时 Nginx 会静默回退到 HTTP/1.1:
- 浏览器打开 DevTools → Network → 刷新页面 → 右键表头勾选 Protocol,任意请求显示
h2才算成功 - 命令行验证:
curl -I --http2 https://your-domain.com,返回HTTP/2 200且无重定向 - 检查 ALPN 是否通告:
openssl s_client -alpn h2 -connect your-domain.com:443 2>/dev/null | grep ALPN,输出应含ALPN protocol: h2
若验证失败,优先排查 OpenSSL 链接问题:ldd $(which nginx) | grep ssl,确认链接的是你指定的 libssl.so(如 libssl.so.1.1),而非系统旧库(如 libssl.so.1.0.2k)。











