Nginx静态编译Zlib和PCRE的核心是将二者源码直接嵌入二进制文件,避免依赖系统动态库;需确保pcre-8.45、zlib-1.3.2与nginx源码平级,通过--with-pcre=../pcre-8.45和--with-zlib=../zlib-1.3.2参数指定路径,编译后用ldd验证无libz.so或libpcre.so输出即成功。

Nginx 静态编译 Zlib 和 PCRE,核心是让最终生成的 nginx 二进制文件不依赖系统动态库,而是把 zlib、pcre 的代码直接打包进去。这样部署时无需在目标机器上安装 zlib-devel 或 pcre-devel,也避免因系统库版本差异导致运行异常。
关键前提是:你得有这些库的源码,且与 nginx 源码放在同一级目录下(或指定明确路径)。
✅ 准备好三个源码目录(平级结构)
假设你在 ~/build/ 下操作:
~/build/ ├── nginx-1.30.4/ # 进入这个目录执行 configure ├── pcre-8.45/ # 不需要提前 make install ├── zlib-1.3.2/ # 同上 └── openssl-3.2.1/ # 如需 HTTPS,也放这里(可选)
注意:不用
make && make install这些库,Nginx 的./configure会自动调用它们的configure和make(内部静默构建),只用于链接。
✅ 执行静态编译命令(关键参数)
进入 nginx-1.30.4/ 目录后,运行:
./configure \ --with-pcre=../pcre-8.45 \ --with-zlib=../zlib-1.3.2 \ --with-http_ssl_module \ --with-http_gzip_static_module \ --prefix=/usr/local/nginx
说明:
-
--with-pcre=../pcre-8.45:指向本地 pcre 源码目录,Nginx 会用它静态编译 rewrite 等模块 -
--with-zlib=../zlib-1.3.2:同理,让 gzip、gzip_static 等模块静态链接压缩能力 -
--with-http_ssl_module:如果用了 OpenSSL,建议也加上--with-openssl=../openssl-3.2.1实现 SSL 静态集成 -
--prefix可按需调整,不影响静态链接逻辑
✅ 编译并验证是否真静态
make -j$(nproc) sudo make install
验证方法(检查 nginx 是否还依赖系统 zlib/pcre 动态库):
ldd /usr/local/nginx/sbin/nginx | grep -E 'zlib|pcre'
✅ 正常情况:无输出,或只显示 not found(说明没链接系统 .so)
❌ 如果看到 /lib64/libz.so.1 或 /lib64/libpcre.so.1,说明没静态成功——大概率是路径写错、目录权限问题,或 pcre/zlib 源码不完整(比如没 configure 脚本)。
⚠️ 常见坑点提醒
- pcre 源码必须含
configure脚本(从官网下载.tar.gz即可,别用 GitHub zip 包,可能缺 autotools 生成文件) - zlib 源码里不能删
configure和Makefile.in,否则 Nginx 构建阶段会报错 - 若提示
pcre-config not found,不是问题——静态模式下 Nginx 不调用系统pcre-config,只要源码路径对就行 - 编译机和目标机架构要一致(如都是 x86_64),否则静态二进制可能无法运行
不复杂但容易忽略


















