核心是禁用非必要静态模块和关闭调试信息:添加--without-http_rewrite_module等剔除无用HTTP模块,--without-mail/--without-stream排除邮件与四层功能,--without-debug减少约15%体积,并仅安装pcre-devel、zlib-devel、openssl-devel等必需依赖。

想让 Nginx 编译后体积更小,核心是两件事:关掉不用的模块、去掉调试信息。默认编译出来的 nginx 二进制常有几 MB,精简后可压到几百 KB,既节省磁盘又减少内存加载开销。
禁用非必要静态模块
模块一旦编译进二进制,就无法运行时卸载。按业务实际删减最有效:
- 纯静态服务?加 --without-http_rewrite_module --without-http_proxy_module --without-http_autoindex_module --without-http_ssi_module 等
- 不用邮件或四层转发?直接加 --without-mail --without-stream
- 确定不依赖 PCRE(比如不用正则匹配)?可加 --without-pcre,但多数场景建议保留
- 完全不需要调试功能?加 --without-debug,能减少约 15% 体积
关闭 debug 模式(关键一步)
默认 debug 模式会嵌入大量断言、日志和符号信息,显著增大体积。不改代码也能禁用:
- 在 configure 命令中显式添加 --without-debug(推荐,安全可靠)
- 或手动编辑源码目录下 auto/cc/gcc 文件,注释掉包含
NGX_DEBUG和NGX_CC_OPT调试相关行(不推荐,易出错)
精简编译参数与依赖
避免引入隐式依赖模块,从源头控制体积:
- 只装必需构建依赖:pcre-devel、zlib-devel、openssl-devel(不要装 geoip、lua、perl 等扩展依赖)
- configure 时不加 --with-http_perl_module、--with-http_xslt_module 等重型模块
- 用 --with-cc-opt='-O2 -fPIE -fstack-protector-strong' 替代默认低效选项,兼顾体积与安全
验证是否生效
编译完成后别急着安装,先快速确认效果:
- 执行 ./objs/nginx -V,检查输出里已无被禁用模块名(如 no http rewrite module)
- 对比大小:ls -lh /usr/local/nginx/sbin/nginx ./objs/nginx
- 查看链接依赖:ldd ./objs/nginx | grep -E "(pcre|ssl|crypto)",若少了 libpcre.so,说明重写模块确实没编进去


















