nginx源码编译安装不支持运行时卸载模块,所有模块均为静态编译进二进制文件;所谓“卸载”实为重新编译时用--without-xxx显式禁用非必要模块,生成更轻量安全的新可执行文件。

Nginx 源码编译安装的版本**不支持动态模块的“卸载”操作**——它根本没有运行时可插拔的动态模块机制(除非你明确启用了 --with-dynamic-module 并使用 .so 文件方式加载,但这在主流发行版和默认编译中极为罕见)。
绝大多数 Linux 系统上通过源码安装的 Nginx,所有模块(包括 http_ssl_module、http_rewrite_module 等)都是**静态编译进二进制文件的**。所谓“卸载模块”,实际是重新编译时**显式禁用不需要的功能**,生成更轻量、更安全的新二进制文件。
确认当前启用的模块
运行以下命令查看编译时启用的模块列表:
nginx -V 2>&1 | grep "configure arguments"
输出类似:configure arguments: --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module
这表示这三个模块被启用;没出现的(如 --without-http_gzip_module)即默认启用,而显式写了 --without-xxx 的才被关闭。
禁用非必要 HTTP 模块(最常用减负方式)
若只做静态服务或简单反向代理,以下模块通常可安全禁用:
-
--without-http_access_module:去掉allow/deny访问控制 -
--without-http_auth_basic_module:禁用基础认证(auth_basic) -
--without-http_autoindex_module:不生成目录索引页 -
--without-http_geo_module和--without-http_map_module:移除变量映射功能 -
--without-http_rewrite_module:彻底禁用rewrite、return、if等指令(需确保配置中无相关语句,否则启动失败) -
--without-http_scgi_module、--without-http_uwsgi_module、--without-http_fastcgi_module:不用 PHP/Python 后端网关时可全关
显式关闭 MAIL 和 STREAM 模块
即使你从不处理邮件代理或四层负载均衡,也建议在 configure 中加入:
--without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module--without-stream_module
这些模块默认不启用,但显式声明能避免未来误启或配置冲突。
重新编译并替换二进制文件
完成 configure 参数调整后,按标准流程重建:
- 进入源码目录,执行
make clean清理旧目标文件 - 运行新 configure 命令(含所有
--without-xxx参数) - 执行
make编译,再sudo make install安装 - 验证:
nginx -V查看新参数,nginx -t测试配置,sudo nginx -s reload平滑重启
注意:不要跳过 make clean,否则可能复用旧 obj 文件导致禁用失效。











