nginx源码编译启用http/2必须同时满足:openssl≥1.0.2e(推荐1.1.1+)、显式启用--with-http_ssl_module和--with-http_v2_module、listen 443 ssl http2配置正确、alpn协商成功,缺一不可。

要在 Linux 上通过源码编译 Nginx 并真正启用 HTTP/2 支持,不能只加个模块名就完事——必须确保 OpenSSL 兼容、模块显式启用、TLS 协商路径畅通。下面分四步讲清楚关键操作。
确认底层依赖是否满足
HTTP/2 在 Nginx 中强制走加密通道,依赖 OpenSSL 的 ALPN 协商能力:
- 运行 openssl version,确认 ≥ 1.0.2e(推荐 1.1.1 或 3.x);若系统自带版本过低(如 CentOS 7 默认的 1.0.2k 虽可用,但 1.0.1e 不支持 ALPN),需单独编译安装新版 OpenSSL
- 安装基础编译工具:yum groupinstall "Development Tools"(CentOS/RHEL)或 apt install build-essential libpcre3-dev zlib1g-dev libssl-dev(Ubuntu/Debian)
- 提前下载好源码包:Nginx(≥1.9.5,建议 1.24+)、OpenSSL(如 3.0.20)、PCRE 和 zlib(系统已有可跳过)
配置编译参数时必须包含两个核心模块
HTTP/2 模块(http_v2_module)与 SSL 模块(http_ssl_module)缺一不可,且需明确指向正确的 OpenSSL:
- 若 OpenSSL 已系统安装且版本达标:
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module - 若 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_ssl_module——http_v2_module依赖它,否则编译会通过但运行时无法协商 HTTP/2
编译安装并验证模块是否载入
执行 make && sudo make install 后,检查是否真启用了模块:
- 运行 /usr/local/nginx/sbin/nginx -V 2>&1 | grep -o with-http_v2_module,输出应为 with-http_v2_module(不能为空或报错)
- 运行 /usr/local/nginx/sbin/nginx -V 2>&1 | grep -i openssl,确认显示的 OpenSSL 路径和版本符合预期
- 运行 ldd /usr/local/nginx/sbin/nginx | grep ssl,确保链接的是你指定的 OpenSSL 动态库(如
libssl.so.3),不是系统旧版
配置文件中启用 HTTP/2 需写对监听指令
模块编译进去了,只是第一步;实际生效还要靠正确配置:
- 编辑站点 server 块,把原 listen 443 ssl; 改为 listen 443 ssl http2;(IPv4)或 listen [::]:443 ssl http2;(IPv6)
- 必须合并写在同一行,不能拆成 listen 443 ssl; 和 listen 443 http2;,否则 Nginx 会静默忽略 http2
- 配套设置 ssl_protocols TLSv1.2 TLSv1.3;,禁用 TLSv1.0/TLSv1.1;证书路径(
ssl_certificate和ssl_certificate_key)要指向可读的 PEM 文件
不复杂但容易忽略











