关键是要强制将PCRE、zlib、OpenSSL等依赖源码与nginx一起编译进二进制,实现全静态链接;需下载各库完整源码包,用--with-pcre=、--with-zlib=、--with-openssl=指定路径,并加-static编译链接选项,最后用file和ldd验证是否真正静态。

要让 Nginx 源码编译产出静态二进制、彻底脱离目标机系统库(如 libpcre.so、libz.so、libssl.so、甚至 libc),关键不是“减少依赖”,而是**强制把所有依赖源码一起编译进最终的 nginx 可执行文件**,即实现全静态链接。
必须用源码而非系统包
系统自带的 libpcre-dev、zlib1g-dev、libssl-dev 提供的是动态库头文件和 .so,无法用于静态链接。你需要下载对应库的**完整源码包**,与 nginx 源码放在同一级目录:
-
PCRE:推荐
pcre-8.45.tar.gz(兼容性最稳,--with-pcre原生支持) -
zlib:用
zlib-1.3.2.tar.gz(当前稳定版) -
OpenSSL:选
openssl-3.2.1.tar.gz(需 HTTPS 时必选) -
nginx:如
nginx-1.30.4.tar.gz
解压后目录结构应为:
~/build/├── nginx-1.30.4/
├── pcre-8.45/
├── zlib-1.3.2/
└── openssl-3.2.1/
configure 参数要禁用动态查找、启用静态构建
进入 nginx-1.30.4/ 目录后,运行以下配置命令(注意路径不带斜杠、无版本号):
./configure \ --prefix=/usr/local/nginx-static \ --with-http_ssl_module \ --with-http_v2_module \ --with-pcre=../pcre-8.45 \ --with-zlib=../zlib-1.3.2 \ --with-openssl=../openssl-3.2.1 \ --with-cc-opt="-static -O2" \ --with-ld-opt="-static -s"
重点说明:
-
--with-pcre=../pcre-8.45等写法告诉 configure:别找系统库,就用这个源码目录,编译时自动走静态流程 -
--with-cc-opt="-static"让编译器默认尝试静态链接所有依赖 -
--with-ld-opt="-static -s"强制链接器全程静态,并 strip 符号减小体积 - 务必**不要加**
--with-pcre-jit或--with-openssl-engine等可能引入动态行为的选项
编译与验证是否真静态
执行:
make -j$(nproc) make install
安装完成后,检查产物是否真正静态:
file /usr/local/nginx-static/sbin/nginx # 应显示:ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), statically linked, ... <p>ldd /usr/local/nginx-static/sbin/nginx</p><h1>应显示:not a dynamic executable</h1><p>
若 ldd 报错或显示任何 .so,说明某环节仍连了动态库——常见原因是 OpenSSL 编译时未关掉 shared 构建,或系统 gcc 默认启用了 -dynamic。此时需在 ../openssl-3.2.1/ 目录先执行:
./Configure linux-x86_64 no-shared --prefix=/tmp/openssl-static && make && make install
再改用 --with-openssl=/tmp/openssl-static 重新 configure。


















