编译精简版Nginx需在configure阶段显式禁用非必要模块:一、执行nginx -V确认当前模块基准;二、分层禁用HTTP(如rewrite、proxy)、MAIL、STREAM等无用模块;三、保留SSL等关键依赖并验证输出与体积缩减效果。

在 Nginx 编译阶段剔除无用模块,是控制二进制体积最直接有效的方式。关键不在于“删配置”,而是在 ./configure 阶段显式关闭默认启用但业务无需的静态模块——这些模块一旦编译进去,就会固化在最终的 nginx 可执行文件中,无法运行时卸载。
确认当前已启用的模块
执行 nginx -V(注意是大写 V),输出中会包含完整的 configure 命令行参数,例如:
这是你当前安装版本的真实编译逻辑,也是后续精简的基准线。不要跳过这步,避免误删依赖模块。
按功能层级精准禁用模块
模块禁用需分层处理,优先从非核心功能入手:
-
HTTP 功能模块:若仅提供静态文件服务,可安全移除
--without-http_autoindex_module、--without-http_rewrite_module、--without-http_proxy_module、--without-http_ssi_module等;禁用约 15 个常见 HTTP 模块后,目标文件体积通常减少 30%–40% -
MAIL 和 STREAM 模块:绝大多数 Web 场景完全不用邮件代理或四层转发,添加
--without-mail和--without-stream即可彻底排除相关代码路径 -
事件驱动与兼容模块:如确定不使用
poll或select作为事件模型(现代 Linux 默认用 epoll),可加--without-poll_module和--without-select_module
执行编译并验证效果
进入源码目录后,完整运行 configure 命令(建议将所有 --without-xxx 参数写在一行,避免 shell 折行错误):
随后执行 make(不要 make install),编译完成后检查:
- 运行
./objs/nginx -V,确认输出中不再出现被禁用模块的字样 - 对比新旧二进制大小:
ls -lh /usr/local/nginx/sbin/nginx ./objs/nginx - 用
ldd ./objs/nginx观察动态链接库数量是否减少(如少了 libpcre.so 表示重写模块已剔除)
注意事项与避坑点
禁用模块不是越多越好,需守住两个底线:
-
SSL/TLS 不可随意禁用:即使当前没配 HTTPS,
--without-http_ssl_module会同时移除 ALPN、TLSv1.3 支持,影响 HTTP/2 和未来升级,建议保留 -
依赖关系必须理清:例如
--without-http_rewrite_module会连带使return、set等指令不可用;若配置中用了try_files,它依赖http_core但不依赖 rewrite,可放心禁用 rewrite -
调试符号可额外剥离:编译完成后执行
strip ./objs/nginx,能再减小 10%–20% 体积,且不影响运行











