必须显式编译启用http_v2_module并指定兼容OpenSSL路径,配置中listen指令须同时含ssl和http2,且依赖TLSv1.2+、有效PEM证书及ALPN协商,缺一不可。

要让 Nginx 支持 HTTP/2,必须在编译阶段显式启用 http_v2_module,且不能依赖系统包管理器提供的预编译版本——它们通常默认关闭该模块或链接旧版 OpenSSL,导致 HTTP/2 无法协商成功。
编译前确认基础依赖已就位
确保系统已安装以下核心组件:
- GCC 编译器:用于构建 Nginx 二进制文件
- PCRE 库:支持正则匹配(如 rewrite 指令)
- Zlib:用于 gzip 压缩
- OpenSSL ≥1.0.2e(强烈推荐 1.1.1 或 3.x):HTTP/2 依赖 ALPN 协商,而 ALPN 由 OpenSSL 实现;系统自带的旧版(如 CentOS 7 的 1.0.2k)虽满足最低版本,但存在兼容性风险,建议手动编译新版并指定路径
configure 阶段关键参数
进入解压后的 Nginx 源码目录,执行 ./configure 时务必包含以下选项:
- --with-http_ssl_module:HTTP/2 强制要求 HTTPS,此模块不可省略
- --with-http_v2_module:启用 HTTP/2 协议支持
-
--with-openssl=/path/to/your/openssl:若使用手动编译的 OpenSSL(如装在
/usr/local/ssl),必须显式指定路径;否则 Nginx 可能链接系统旧库,导致 ALPN 不可用 - 可选但实用:--with-http_stub_status_module,便于后续监控连接状态
示例命令(OpenSSL 安装在 /usr/local/ssl):
编译与安装
执行标准构建流程:
-
make:编译源码 -
sudo make install:安装到指定前缀路径(如/usr/local/nginx)
安装完成后,运行 nginx -V 2>&1 | grep http_v2,输出中应明确出现 with-http_v2_module;同时用 nginx -V 2>&1 | grep -i openssl 确认链接的是你指定的 OpenSSL 路径和版本。
配置文件中启用 HTTP/2 协议
模块启用只是前提,真正生效还需在站点配置中激活协议协商:
- 编辑
nginx.conf或对应 server 配置,在 HTTPS 的server块中,将listen 443 ssl;改为listen 443 ssl http2;(IPv4)或listen [::]:443 ssl http2;(IPv6) - 必须同时包含
ssl和http2,缺一不可;拆成两行或单独写http2会被 Nginx 忽略 - 确保
ssl_protocols TLSv1.2 TLSv1.3;,禁用 TLSv1.0/TLSv1.1 - 证书文件(
ssl_certificate和ssl_certificate_key)需为 PEM 格式,权限允许 Nginx 读取
配置完成后执行 nginx -t && nginx -s reload 生效。


















