编译 Nginx 时应禁用不安全模块和协议以最小化攻击面:禁用 autoindex、SSI、SCGI/Uwsgi、mail 模块;强制使用 TLSv1.2+ 并限定高强度加密套件;避免未审计第三方模块,禁用动态加载;生产环境移除 --with-debug;需验证配置生效并持续更新。

编译 Nginx 时禁用不安全模块和协议,是加固 Web 服务最基础也最关键的一步。默认配置常启用过时、高危或冗余功能,直接暴露攻击面。核心原则是:只保留业务必需的模块,关闭所有已知风险组件。
禁用高危或废弃模块
Nginx 默认启用部分模块存在历史漏洞或维护停滞,应显式排除:
-
ngx_http_autoindex_module:自动索引目录易泄露敏感路径,除非明确需要目录浏览,否则务必禁用(
--without-http_autoindex_module) -
ngx_http_ssi_module:服务器端包含(SSI)支持执行命令或读取文件,曾多次触发远程代码执行,非静态站点集成场景建议移除(
--without-http_ssi_module) -
ngx_http_scgi_module 和 ngx_http_uwsgi_module:若后端不用 SCGI/Uwsgi 协议(如仅用 FastCGI 或反向代理 HTTP),应关闭以缩小攻击面(
--without-http_scgi_module --without-http_uwsgi_module) -
ngx_mail_module:纯 Web 服务无需邮件模块,必须禁用(
--without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module)
强制禁用不安全协议与弱加密套件
协议与 TLS 配置不在 configure 阶段控制,但需在编译后严格配置。关键动作包括:
- 在
nginx.conf的server或http块中,设置ssl_protocols TLSv1.2 TLSv1.3;,彻底禁用 SSLv2/SSLv3/TLSv1.0/TLSv1.1 - 使用
ssl_ciphers限定高强度套件,例如:ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
排除所有含RC4、DES、3DES、MD5、SHA1的套件 - 启用
ssl_prefer_server_ciphers off;(现代客户端协商更安全),并开启 OCSP Stapling 提升证书校验效率与隐私
精简第三方模块与动态加载风险
第三方模块(如 headers-more、echo、lua)若未经安全审计,可能引入内存泄漏或 RCE 漏洞:
- 避免使用已停止维护的模块(如旧版 ngx_devel_kit + echo-nginx-module 组合)
- 如需 Lua 能力,优先选用 OpenResty 发行版 或官方支持的
nginx-module-lua(对应 Nginx 版本严格匹配) - 禁用动态模块加载(
--without-dso),防止运行时加载未签名或恶意模块 - 编译时加
--with-debug仅用于调试环境,生产环境必须移除,避免泄露内部状态信息
验证与持续加固要点
编译完成不是终点,需验证实际生效情况:
- 运行
nginx -V检查 configure arguments,确认无--with-http_autoindex_module等被禁用项 - 用
openssl s_client -connect your.site:443 -tls1_1测试是否拒绝 TLSv1.1 连接 - 使用 SSL Labs Test 扫描 TLS 配置等级,目标为 A+(非仅 A)
- 定期更新 OpenSSL 和 PCRE 库版本,Nginx 自身也应跟踪 stable 分支安全更新(如 1.24.x 系列)
不复杂但容易忽略:安全始于最小化,而非堆砌防护。每次升级或新增功能前,重新审视模块清单与 TLS 策略,才是可持续的加固节奏。

















