Nginx源码安装需用--without-xxx显式禁用默认启用的非必要模块(如http_autoindex、http_proxy等),以减小体积、降低攻击面、节省内存;禁用后须同步清理配置中相关指令。

Nginx 源码安装时精简默认模块,核心是用 --without-xxx 显式禁用不用的模块,而不是依赖默认不编译——因为很多模块(如 http_auth_basic、http_autoindex、http_proxy 等)在标准源码构建中其实是默认启用的。
这样做能减少二进制体积、降低潜在攻击面、节省内存开销,也便于后期维护和安全审计。
为什么需要手动禁用?
Nginx 官方源码 configure 脚本的规则是:
- 以
--with-xxx开头的选项,表示「显式启用」某个模块; - 以
--without-xxx开头的选项,表示「显式禁用」某个模块; -
多数 HTTP 模块(尤其基础功能相关)默认是开启的,哪怕你没写
--with-http_xxx_module。
比如:http_auth_basic、http_gzip、http_stub_status这些,不加--without就会编译进去。
常见可安全禁用的模块(按用途分类)
✅ 静态内容与基础功能类(多数网站不需要)
-
--without-http_autoindex_module
(禁用目录列表页,避免暴露文件结构) -
--without-http_browser_module
(UA识别模块,极少单独使用) -
--without-http_empty_gif_module
(生成 1x1 透明 GIF,已过时) -
--without-http_geo_module
(IP 地理区域映射,需额外配置且非必需) -
--without-http_map_module
(变量映射,高级用法,静态站点通常不用) -
--without-http_split_clients_module
(A/B 测试分流,业务未用则可删)
✅ 后端代理与协议类(纯静态站或 PHP-FPM 直连时不用)
-
--without-http_proxy_module
(反向代理核心,若只做静态服务或 FastCGI,可禁) -
--without-http_fastcgi_module
(注意:PHP 场景必须保留!但若用 uWSGI/HTTP 后端可禁) -
--without-http_scgi_module
(SCGI 协议支持,小众) -
--without-http_uwsgi_module
(uWSGI 协议,Python 项目才可能用) -
--without-http_memcached_module
(Memcached 直连,现多由后端或缓存层统一处理)
✅ 安全与扩展类(非必要不启)
-
--without-http_auth_basic_module
(基础 HTTP 认证,如无密码保护目录需求,建议关) -
--without-http_ssi_module
(服务端包含,存在注入风险,现代开发基本不用) -
--without-http_dav_module
(WebDAV 文件管理,高危,除非明确需要) -
--without-http_flv_module/--without-http_mp4_module
(流媒体支持,普通网站无需)
⚠️ 注意:
--without-http_ssl_module不建议禁用(HTTPS 已成标配),--without-http_gzip_module也不推荐(影响传输效率)。
实用 configure 示例(精简 + 必需保留)
./configure \ --prefix=/usr/local/nginx \ --user=www-data \ --group=www-data \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_gzip_module \ --with-http_realip_module \ --with-http_stub_status_module \ --without-http_autoindex_module \ --without-http_browser_module \ --without-http_empty_gif_module \ --without-http_geo_module \ --without-http_map_module \ --without-http_proxy_module \ --without-http_scgi_module \ --without-http_uwsgi_module \ --without-http_memcached_module \ --without-http_auth_basic_module \ --without-http_ssi_module \ --without-http_dav_module
✅ 编译前确认系统已装好依赖:
yum install -y gcc pcre-devel zlib-devel openssl-devel # 或 Debian/Ubuntu: apt-get install -y build-essential libpcre3-dev zlib1g-dev libssl-dev
然后执行:
make && sudo make install
补充提醒
- 禁用模块后,配置文件中若出现对应指令(如
auth_basic、dav_methods),Nginx 启动会报错,需同步清理配置; - 第三方模块(如
nginx-module-vts、headers-more)需用--add-module=显式引入,不受--without影响; - 动态模块(
.so文件)从 1.9.11+ 支持,可先编译为动态模块再按需加载,更灵活 —— 但精简目标仍是减少主二进制体积和攻击面。
不复杂但容易忽略。


















