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-3.0.13.tar.gz 解压后未安装),就用 --with-openssl=/path/to/openssl-src
make install 过 OpenSSL 到自定义路径(比如 /opt/openssl),那就不能用 --with-openssl 指向安装目录——它只接受源码根目录,否则 configure 会报错或静默忽略真正有效的做法是:不用 --with-openssl,改用编译和链接参数精准控制
configure 时加参数,把头文件路径传给编译器:
--with-cc-opt="-I/opt/openssl/include"(替换成你实际的 include 路径,例如 /usr/local/ssl/include)
-DOPENSSL_NO_SSL3 -DOPENSSL_NO_TLS1 等宏定义,避免旧协议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.soln -sf libcrypto.so.3 /opt/openssl/lib/libcrypto.so
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 这样的路径openssl s_client -connect localhost:443 -tls1_3 能成功握手,说明 TLS 1.3 等新特性已启用不复杂但容易忽略