必须禁用autoindex、ssi、scgi/uwsgi及mail模块:autoindex易泄露路径,ssi曾致rce,scgi/uwsgi非必要时扩大攻击面,mail模块纯web服务完全冗余;编译时用--without参数显式排除,并通过nginx -v验证生效。

关闭不必要的 Nginx 模块是安全加固最直接有效的一环。模块越多,潜在漏洞面越广;默认启用的许多模块在多数生产场景中根本用不到,反而增加被利用风险。关键不是“能不能关”,而是“为什么必须关”和“怎么关才可靠”。
哪些模块必须优先禁用
以下模块存在明确历史漏洞、协议过时或功能冗余,若无强业务需求,应在编译阶段显式排除:
-
ngx_http_autoindex_module:自动目录索引易暴露路径结构,常被用于信息收集,加
--without-http_autoindex_module -
ngx_http_ssi_module:服务器端包含(SSI)支持命令执行与文件读取,曾触发多个 RCE 漏洞,加
--without-http_ssi_module -
ngx_http_scgi_module 和 ngx_http_uwsgi_module:除非后端明确使用 SCGI/Uwsgi 协议,否则关闭可缩小攻击面,加
--without-http_scgi_module --without-http_uwsgi_module -
ngx_mail_module 及其子模块(POP3/IMAP/SMTP):纯 Web 服务完全不需要邮件功能,加
--without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module
如何验证模块是否真正关闭
编译安装完成后,不能仅凭 configure 命令参数判断。必须执行:
- 运行
nginx -V 2>&1 | grep -o "with.*module\|without.*module"查看实际启用/禁用列表 - 检查输出中是否出现
without-http_autoindex-module等你指定的禁用项(注意拼写与连字符) - 启动 Nginx 后,尝试访问一个未配置的目录路径,确认返回 403 或 404,而非自动生成的索引页
别忽略的配套动作
模块禁用只是起点,还需同步落实几项关键配置,防止残留风险:
- 在
nginx.conf的http块中添加server_tokens off;,隐藏版本号,减少信息泄露 - 禁用不安全 HTTP 方法:在
server块中加入if ($request_method !~ ^(GET|HEAD|POST)$) { return 405; } - 移除第三方未审计模块:如旧版
echo-nginx-module或停更的 Lua 扩展,改用 OpenResty 或官方维护的nginx-module-lua - 禁用动态模块加载:编译时加
--without-dso,杜绝运行时加载未经签名模块的可能
常见误区提醒
有些操作看似“关模块”,实则无效或危险:
- 仅在
nginx.conf中注释掉load_module行,对已静态编译进二进制的模块毫无作用 - 误删
--with-http_rewrite_module导致重定向、HTTPS 强制跳转等功能失效,需先确认业务依赖 - 为“精简体积”盲目禁用
gzip、ssl模块,反而影响性能与安全传输能力 - 禁用模块后未重启服务或未验证配置语法(
nginx -t),导致服务异常











