编译nginx时需用--with-zlib=指定zlib源码根目录(含zlib.h),而非安装路径;路径下须有include/zlib.h和lib/libz.a/.so;配合--with-zlib-opt可传编译参数,生效前提是指向源码目录。

编译 Nginx 时若系统自带的 zlib 版本过低(如 CentOS 7 默认 zlib 1.2.7),或需要启用特定功能(如 zlib-ng、静态链接、带 Brotli 支持的定制 zlib),就必须显式指定 zlib 源码路径和版本。关键不是“装了 zlib-dev 就能用”,而是让 ./configure 找到你想要的头文件和库文件,并跳过系统默认查找逻辑。
确认目标 zlib 的安装结构
无论你用源码编译安装,还是解压后直接使用,zlib 目录下必须包含:
- include/zlib.h —— 头文件,configure 会检查它是否存在
- lib/libz.a 或 lib/libz.so(或 libz.so.x)—— 静态/动态库文件
例如你把 zlib-1.3 解压到 /opt/zlib-1.3,则路径应为:/opt/zlib-1.3/include/zlib.h/opt/zlib-1.3/lib/libz.a
--with-zlib=PATH:指向 zlib 源码目录(非安装前的 build 目录)
这是最常用也最易出错的选项。Nginx configure 要求 --with-zlib= 后跟的是 zlib 的源码根目录(即含 configure.ac / Makefile.in / zlib.h 的那一层),而不是 install 后的 prefix 目录。
✅ 正确做法(推荐):
- 下载 zlib 源码(如 zlib-1.3.tar.gz),解压:
tar -xf zlib-1.3.tar.gz - 保持原样,不执行
./configure && make && make install - 在 Nginx configure 中写:
--with-zlib=/path/to/zlib-1.3
⚠️ 常见错误:
- 误将
--with-zlib=/usr/local(这是 install prefix)→ configure 会报zlib.h not found - 误用已编译好的 zlib build 目录(含 objs/ 子目录但无顶层 zlib.h)→ 同样找不到头文件
配合 --with-zlib-opt 和 --with-zlib-asm(可选优化)
若需传递额外编译参数给 zlib(比如启用 asm 加速、禁用某些函数),可用:
-
--with-zlib-opt="-DZLIB_COMPAT -fPIC":传给 zlib 的 CFLAGS -
--with-zlib-asm=generic:启用汇编优化(支持 x86/x86_64/arm 等,值查 zlib/README)
注意:--with-zlib-opt 只在 --with-zlib= 指向源码目录时生效;若依赖系统 zlib,则该选项被忽略。
验证是否生效:编译后检查依赖与运行时行为
编译成功后,用以下方式确认 Nginx 实际链接的是你指定的 zlib:
-
ldd objs/nginx | grep zlib→ 应显示你指定路径下的 libz.so(若静态链接则无输出) -
objs/nginx -V 2>&1 | grep -i zlib→ 输出中会显示 zlib version,例如zlib: 1.3 - 启动后访问
/nginx_status或用curl -H "Accept-Encoding: gzip" ...测试压缩是否正常工作
若仍显示旧版本(如 1.2.7),大概率是 --with-zlib= 路径不对,或该路径下 zlib.h 不可读,或被 --with-zlib-opt 中的错误参数导致内部编译失败而 fallback 到系统 zlib。










