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

/sbin/nginx 是 Nginx 编译后生成的主二进制可执行文件,它的体积大小直接取决于编译时启用或禁用的模块、优化选项及调试信息。要给它“瘦身”,核心思路是:精简功能、关闭冗余、启用编译优化、移除调试符号。不是运行时压缩,而是从源头控制二进制大小。
编译前剔除无用模块
Nginx 默认会编译大量 HTTP、MAIL、STREAM 模块,但多数生产 Web 服务只需基础静态服务能力。
-
HTTP 层精简(最有效)
若只提供静态页面、API 或前端 SPA 服务(不代理、不重写、不自动索引),可安全禁用:-
--without-http_autoindex_module(禁用目录列表) -
--without-http_rewrite_module(禁用rewrite和正则匹配,移除 PCRE 依赖) -
--without-http_proxy_module(不用反向代理时移除) -
--without-http_fastcgi_module(不用 PHP-FPM 时移除) -
--without-http_uwsgi_module、--without-http_scgi_module -
--without-http_ssi_module、--without-http_geoip_module等非必需模块
✅ 效果:禁用约 12–15 个模块后,二进制体积通常减少 30%–40%;若去掉
rewrite,还会让ldd ./objs/nginx不再显示libpcre.so,进一步轻量。 -
-
彻底关闭 MAIL 和 STREAM 模块
大多数 Web 服务器完全不需要邮件代理或四层转发:-
--without-mail --without-stream
-
-
移除低效事件模块(Linux 环境)
现代 Linux 默认且推荐epoll,可删掉兼容性模块:-
--without-poll_module --without-select_module
-
编译时启用优化选项
默认 debug 模式会插入大量调试符号和断言,显著增大体积:
-
关闭 debug 模式
修改源码中auto/cc/gcc文件,注释掉这行:# debug CFLAGS="$CFLAGS -g"
或在
./configure中显式覆盖:--with-cc-opt='-O2 -fomit-frame-pointer -DNGX_DEBUG=0'
-
使用高级编译优化
--with-cc-opt='-O3 -march=native' \ --with-cpu-opt=generic # 或具体型号如 `skylake`
避免动态链接不必要的库
如已禁用rewrite,PCRE 就不再需要;禁用ssl相关模块(--without-http_ssl_module)可去掉libssl和libcrypto依赖(但 HTTPS 场景不可取)。
编译后进一步裁剪(可选)
-
剥离调试符号(对已编译二进制有效):
strip /usr/local/nginx/sbin/nginx
可减小数百 KB,尤其适合嵌入式或容器镜像场景。
-
检查最终效果:
# 查看模块是否已剔除 ./objs/nginx -V 2>&1 | grep -E "(http_|mail|stream|poll|select)" # 对比大小 ls -lh /usr/local/nginx/sbin/nginx ./objs/nginx # 查看依赖库(越少越干净) ldd ./objs/nginx
不复杂但容易忽略


















