nginx 编译时需显式指定非标准 openssl 路径:--with-cc-opt="-i/path/include" 告诉编译器头文件位置,--with-ld-opt="-l/path/lib -wl,-rpath,/path/lib" 指定库路径并嵌入运行时搜索路径,同时避免 pkg-config 干扰。

Nginx 源码编译时指定非标准目录的 OpenSSL 动态库路径,关键不是“告诉 Nginx 用哪个库”,而是让编译器找到头文件、链接器找到库文件、运行时能加载到对应 .so。系统默认只认 /usr/include 和 /usr/lib,你把 OpenSSL 装在 /opt/openssl 或 /usr/local/ssl 这类路径,就必须显式引导每一步。
明确区分两种使用方式
- 如果你有 OpenSSL 源码(如
openssl-3.0.13.tar.gz解压后未安装),就用--with-openssl=/path/to/openssl-src - 如果你已经
make install过 OpenSSL 到自定义路径(比如/opt/openssl),那就不能用--with-openssl指向安装目录——它只接受源码根目录,否则 configure 会报错或静默忽略
真正有效的做法是:不用 --with-openssl,改用编译和链接参数精准控制
编译阶段:让 gcc 找到 ssl.h
configure 时加参数,把头文件路径传给编译器:
-
--with-cc-opt="-I/opt/openssl/include"
(替换成你实际的 include 路径,例如/usr/local/ssl/include) - 可选加固:加上
-DOPENSSL_NO_SSL3 -DOPENSSL_NO_TLS1等宏定义,避免旧协议
链接阶段:让 ld 找到 libssl.so 并嵌入运行时路径
configure 时加参数,指定库位置 + 强制运行时也能找到:
-
--with-ld-opt="-L/opt/openssl/lib -Wl,-rpath,/opt/openssl/lib"
(-L告诉链接器去哪找.so;-rpath把路径写进二进制,启动时自动加载) - 若库名不是标准
libssl.so(比如只有libssl.so.3),需确保该目录下有对应软链:ln -sf libssl.so.3 /opt/openssl/lib/libssl.so ln -sf libcrypto.so.3 /opt/openssl/lib/libcrypto.so
避免 pkg-config 干扰
Nginx configure 默认调用 pkg-config openssl 查路径。如果系统里有多个 openssl.pc(比如 /usr/lib64/pkgconfig/openssl.pc 指向旧版),即使你写了 -I 和 -L,configure 仍可能优先读旧配置。
- 先查所有位置:
find /usr -name openssl.pc 2>/dev/null - 临时屏蔽旧的:
mv /usr/lib64/pkgconfig/openssl.pc /usr/lib64/pkgconfig/openssl.pc.bak - 或设置环境变量覆盖:
PKG_CONFIG_PATH=/opt/openssl/lib/pkgconfig,再运行 configure
验证是否生效
编译安装完成后,检查两处:
-
objs/nginx -V | grep -i openssl→ 应显示类似built with OpenSSL 3.0.13 -
ldd objs/nginx | grep ssl→ 输出应包含/opt/openssl/lib/libssl.so.3这样的路径 - 启动 nginx 后,
openssl s_client -connect localhost:443 -tls1_3能成功握手,说明 TLS 1.3 等新特性已启用
不复杂但容易忽略











