Nginx 源码安装后无法运行时卸载模块,必须重新编译并显式禁用非必要模块以减小体积和内存占用;通过 nginx -V 查看当前启用模块,使用 --without-xxx 参数配置禁用,编译前执行 make clean 并验证配置。

源码安装的 Nginx 无法通过卸载“模块”来释放运行时资源——模块是编译时静态链接进二进制文件的,不是运行时插件。所谓“卸载模块”,实际是指**重新编译 Nginx,显式禁用不需要的功能模块,生成更精简、更小体积、内存占用更低的可执行文件**。
确认当前启用的模块
运行以下命令查看当前 Nginx 编译时启用了哪些模块:
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_rewrite_module)即为已被禁用。
禁用非必要 HTTP 模块(最有效减负方式)
若仅提供静态文件服务或简单反向代理,多数 HTTP 模块可安全关闭。常见可禁用项包括:
-
--without-http_access_module:移除 IP 访问控制(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:不用后端网关协议时可全关
关闭 MAIL 和 STREAM 模块(默认不启用,但建议显式声明)
即使你从不使用邮件代理或四层负载均衡,也建议在 configure 中加入:
--without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module \
--without-stream_limit_conn_module --without-stream_realip_module --without-stream_geo_module
这能防止某些依赖检测意外激活关联代码,进一步压缩二进制体积与内存 footprint。
编译前清理与验证
进入原始 Nginx 源码目录(如 nginx-1.24.0),执行:
-
make clean:清除上一次编译的objs/目录和中间文件 - 构造完整 configure 命令(含所有
--without-xxx参数),确保只保留必需项,例如:
./configure --prefix=/usr/local/nginx --without-http_rewrite_module --without-http_gzip_module --without-http_ssl_module - 运行
make编译,再sudo make install覆盖安装(注意备份原配置)
编译完成后,用 nginx -V 再次核对 configure 参数,确认目标模块已不在列表中。
验证效果
重启服务后,可通过以下方式确认资源优化成效:
- 对比前后二进制大小:
ls -lh /usr/local/nginx/sbin/nginx - 观察内存占用:
ps aux --sort=-%mem | head -5,重点关注 nginx worker 进程的 RSS - 尝试调用被禁模块的指令(如在配置中加
rewrite ^/old /new;),应报错unknown directive "rewrite"
不复杂但容易忽略重编译前的 make clean 和配置语法检查,建议每次修改后都验证 nginx -t。


















