源码安装 Nginx 时精简编译参数,核心是剔除未用模块以减小二进制体积、降低内存占用并缩小攻击面;需先运行 nginx -V 查看当前 configure 命令行作为基准,再按需禁用非核心 HTTP 模块(如 autoindex、rewrite、SSI 等)、MAIL 和 STREAM 模块,并配合 --without-debug、-O2 优化及最小依赖安装。

源码安装 Nginx 时精简编译参数,核心是让没用的模块代码根本不进入最终二进制文件——不是靠配置关功能,而是从源头剔除。这能直接减小 /sbin/nginx 体积、降低内存占用(每个 worker 进程可省 2–6 MB),还能缩小攻击面。
先确认当前启用哪些模块
运行 nginx -V(大写 V),看输出里的 configure 命令行。它会列出所有已启用或禁用的模块,比如:
-
--with-http_ssl_module(已启用) -
--without-http_geo_module(已禁用) -
--with-http_v2_module(可能没开)
这是你后续精简的基准线,避免误删依赖项。
按需禁用 HTTP 层非核心模块
多数静态服务、反向代理或前端托管场景,只需 http_core、ngx_http_upstream_module、ngx_http_proxy_module 和 SSL 支持。以下模块若未在配置中使用,可安全剔除:
-
--without-http_autoindex_module:禁目录列表,防敏感路径泄露 -
--without-http_rewrite_module:不用rewrite/if/return就禁用;还能去掉 PCRE 依赖,ldd ./objs/nginx不再显示libpcre.so -
--without-http_ssi_module:SSI 有 RCE 风险,现代架构基本不用 -
--without-http_scgi_module、--without-http_uwsgi_module、--without-http_fastcgi_module:后端不是 SCGI/UWSGI/FastCGI 就全关 -
--without-http_geo_module、--without-http_map_module:不需 IP 映射或变量映射时移除
彻底关闭 MAIL 和 STREAM 模块
除非你真在跑邮件代理或四层 TCP/UDP 负载均衡,否则这两类模块完全无用,且隐含较多依赖:
-
--without-mail:一次性禁用 POP3/IMAP/SMTP 全部子模块 -
--without-stream:关闭四层转发能力,不影响 HTTP/HTTPS 七层代理
优化编译选项与依赖
光禁模块还不够,配合编译参数进一步瘦身:
-
--without-debug:移除调试符号,减少约 15% 二进制体积 -
--with-cc-opt='-O2':启用 GCC 优化,提升性能且不增内存 -
--without-poll_module、--without-select_module:Linux 下只用 epoll,删掉兼容性事件模型 - 只装必需依赖:
yum install pcre-devel zlib-devel openssl-devel(CentOS)或apt install libpcre3-dev zlib1g-dev libssl-dev(Debian),不装 perl、xslt 等无关开发包


















