Nginx静态链接zlib需指定其源码路径(如--with-zlib=/path/to/zlib-1.3.1),而非系统-devel包;编译后ldd无zlib输出且strings含deflate/inflate即成功,否则因路径错误或版本不兼容导致失败。

要在 Nginx 编译时静态链接 zlib,核心是让 configure 找到 zlib 的源码(而非系统共享库),并强制使用静态链接方式,避免运行时依赖系统的 libz.so。
必须用 zlib 源码,不能只装开发包
系统里的 zlib-devel(如 Ubuntu 的 zlib1g-dev)只提供头文件和 .so / .a,但默认链接的是动态库。静态编译要求所有符号都打进 nginx 二进制,所以必须指定 zlib 源码路径:
- 下载 zlib 源码包(例如
zlib-1.3.1.tar.gz),解压到本地目录,如/path/to/zlib-1.3.1 - 确保该目录下有
configure、Makefile和zlib.h等完整构建文件 - Nginx 的
--with-zlib=参数只认源码目录,不接受安装前缀或.a文件路径
配置时显式指定 zlib 源码路径
进入 Nginx 源码目录后,运行 configure 并带上 --with-zlib:
./configure --prefix=/usr/local/nginx --with-zlib=/path/to/zlib-1.3.1 --with-http_gzip_static_module- 加上
--with-http_gzip_static_module是可选但推荐的,它依赖 zlib,也能验证静态链接是否生效 - 不要加
--with-zlib-lib或--with-zlib-include—— 这些参数不存在,Nginx 不识别
确认静态链接成功
编译安装完成后,检查生成的 nginx 二进制是否真把 zlib 打进去了:
- 执行
ldd /usr/local/nginx/sbin/nginx | grep zlib—— 若无输出,说明没动态链接libz.so - 执行
strings /usr/local/nginx/sbin/nginx | grep -i 'deflate\|inflate'—— 应能搜到 zlib 内部函数名,证明代码已内嵌 - 把该二进制拷到一台没装 zlib 的干净 Linux 机器上运行
./nginx -t,不报libz.so: cannot open shared object file即为成功
常见失败原因和应对
如果 configure 仍提示 zlib library not found,不是 zlib 没装,而是路径或结构不对:
- 检查
/path/to/zlib-1.3.1下是否有zlib.h和contrib/等子目录;若只有编译后的/usr/local/zlib安装目录,不满足要求 - 某些旧版 Nginx(如 1.16 之前)对 zlib 版本敏感,建议用
zlib-1.2.11或zlib-1.3.1,避开zlib-1.3.0的已知兼容问题 - 若同时静态链接 OpenSSL 和 PCRE,它们也必须用源码路径(
--with-openssl=、--with-pcre=),否则 zlib 静态了,其他模块仍可能拖垮整个静态目标











