Nginx动态模块无法运行时卸载,清理需三步:删除.so文件、移除load_module配置、systemctl restart重启进程;仅reload或仅删文件均无效。

Nginx 没有“动态模块”的运行时卸载机制——所有模块(包括所谓“动态模块”)在启动时加载后即常驻内存,无法像插件一样随时启停或卸载。所谓“清理无用的动态模块”,实际是指移除不再需要的动态模块文件,并确保配置中不加载它们,从而避免内存占用和潜在安全风险。
动态模块不是运行时可卸载的
Nginx 自 1.9.11 起支持 load_module 指令加载 .so 文件形式的动态模块(如 ngx_http_geoip2_module、ngx_http_headers_more_filter_module),但这些模块:
- 加载后随 worker 进程生命周期存在,无法
unload; - 配置中只要保留
load_module /path/to/module.so;,每次 reload 或启动都会重新加载; - 即使注释掉该行并
nginx -s reload,已加载的模块仍保留在当前 worker 内存中,直到进程重启(平滑升级会逐步替换 worker,旧模块才真正退出)。
所以,“清理”动作必须包含两个层面:删文件 + 删配置 + 重启进程。
清理步骤:三步到位
-
找出当前启用的动态模块
查看主配置文件(通常是/etc/nginx/nginx.conf或/usr/local/nginx/conf/nginx.conf)中所有load_module行:grep "load_module" /etc/nginx/nginx.conf
同时检查 include 的子配置(如
/etc/nginx/conf.d/*.conf)是否也含该指令。 -
删除对应
.so文件
根据load_module路径定位模块文件,例如:load_module /usr/lib/nginx/modules/ngx_http_geoip2_module.so;
→ 执行:sudo rm -f /usr/lib/nginx/modules/ngx_http_geoip2_module.so
-
移除配置并彻底重启
注释或删除load_module行,保存后执行:sudo nginx -t && sudo systemctl restart nginx
注意:必须用
restart(而非reload),才能确保旧 worker 完全退出、新进程不加载已删模块。
常见误操作提醒
- ❌ 仅
nginx -s reload不会释放已加载模块的内存; - ❌ 仅删
.so文件但保留load_module行,会导致nginx -t报错或启动失败; - ❌ 把动态模块路径写错(如漏掉
.so后缀或路径拼写错误),Nginx 启动时静默忽略,但可能留下残留引用; - ✅ 推荐清理后验证:
sudo lsof -p $(cat /var/run/nginx.pid) | grep '\.so$',输出应不含你已删的模块名。
不复杂但容易忽略。


















