Nginx支持HTTPS必须在源码编译时链接OpenSSL库,主流方式有两种:一是动态链接系统openssl-devel(或libssl-dev)开发包,configure时加--with-http_ssl_module即可自动探测;二是静态编译指定OpenSSL源码,需用--with-openssl=/path/to/openssl-src指向解压后的源码根目录并卸载系统开发包,缺一不可。

Nginx 本身不自带 OpenSSL,要支持 HTTPS,必须在编译 Nginx 时链接 OpenSSL 库。关键不是“安装 OpenSSL 支持模块”,而是让 Nginx 源码编译过程正确识别并链接 OpenSSL 的头文件与库文件。这分两种主流方式:动态链接系统 OpenSSL 开发包(最常用),或静态编译指定版本的 OpenSSL 源码(更可控)。
用系统 openssl-devel(或 libssl-dev)动态链接
这是生产环境快速部署的推荐方式,Nginx 运行时依赖系统的 libssl.so,升级灵活、验证简单。 - 在 CentOS/RHEL 上执行:sudo yum install -y openssl openssl-devel - 在 Ubuntu/Debian 上执行:
sudo apt-get install -y openssl libssl-dev - 确认头文件存在:
ls /usr/include/openssl/ssl.h(应有输出) - 进入 Nginx 源码目录后,configure 至少带上:
./configure --with-http_ssl_module --with-http_v2_module
无需指定 --with-openssl=,Nginx 会自动探测系统开发包路径 - 编译安装:
make && make install - 验证是否启用:
/usr/local/nginx/sbin/nginx -V 2>&1 | grep -i ssl(应显示 built by … with OpenSSL)
静态编译指定 OpenSSL 源码(彻底解耦系统依赖)
适用于需锁定 TLS 版本、规避系统 OpenSSL 漏洞、或容器内无包管理器的场景。 - 下载 OpenSSL 源码(如 3.0.13),解压到某路径(如 /opt/src/openssl-3.0.13),**不要执行 make install** - 确保该目录下有 include/、crypto/、ssl/ 及 Configure 脚本 - 进入 Nginx 源码目录,configure 命令明确指向源码路径:./configure --with-openssl=/opt/src/openssl-3.0.13 --with-http_ssl_module --with-openssl-opt="enable-tls1_3 no-asm" - **卸载系统 openssl-devel**,否则 configure 可能静默回退到旧版 - 编译安装后,检查是否静态链接成功:
ldd /usr/local/nginx/sbin/nginx | grep ssl(应无任何输出)
常见错误与避坑点
- 误用安装路径:--with-openssl 必须是源码根目录,不是 /usr/local/openssl 或 /opt/openssl - 混淆开发包与运行时包:只装 openssl 命令行工具(不带 -devel)会导致 configure 报错“OpenSSL library not found” - PCRE 和 zlib 同理:若需自定义 PCRE 或 zlib,也必须传 --with-pcre=源码路径、--with-zlib=源码路径,不能只装 pcre-devel - 模块未启用:--with-http_ssl_module 必须显式声明,否则即使 OpenSSL 存在,HTTPS 功能也不会编译进 nginx不复杂但容易忽略


















