nginx源码编译因磁盘空间不足失败时,常表现为编译中断、链接失败或临时文件写入异常;需提前检查/tmp、当前目录及--prefix路径的可用空间(建议≥500mb),识别“no space left on device”等错误信号,并通过dd测试、清理残留、指定build-dir或禁用debug等方法快速应对。

源码编译 Nginx 时因磁盘空间不足而失败,通常不会直接报“磁盘满”,而是表现为编译中断、链接失败、临时文件写入异常或 make 过程卡死/退出码非零。关键在于提前预判、过程监控和精准定位。
确认编译前的可用空间是否达标
官方要求约 200MB 临时空间(含解压、object 文件、中间产物),但实际建议预留 ≥500MB,尤其启用多模块或调试符号时。执行:
-
df -h /tmp(多数编译默认用 /tmp)和df -h .(当前工作目录所在分区) - 若使用自定义
--prefix=/usr/local/nginx,还需检查该路径所在磁盘:df -h /usr/local - 注意:
/tmp可能是内存挂载(tmpfs),df -T查看类型;若为 tmpfs 且大小不足,需改用其他目录或增大 tmpfs 限额
观察编译过程中的典型失败现象
空间不足常引发以下可识别信号:
-
cc: fatal error: cannot execute 'cc1': execvp: No space left on device—— GCC 无法启动子进程 -
ar: /path/to/libnginx.a: Cannot open: No space left on device—— 归档阶段写入失败 -
make[1]: *** [objs/nginx] Error 1且前一行无明确错误,大概率是链接器ld写临时段失败 -
configure阶段看似成功,但make到 70%–90% 突然中止,反复重试均卡在同一目标文件(如ngx_http_upstream.o)
快速验证与临时规避方法
不重装系统,立即判断是否为空间问题:
- 编译前手动测试写入:
dd if=/dev/zero of=/tmp/testspace bs=1M count=300 2>/dev/null && echo "OK" || echo "FAIL" - 若失败,清空
/tmp下旧编译残留:rm -rf /tmp/ngx_* /tmp/cc* - 强制指定构建目录到富余磁盘:
./configure --prefix=/opt/nginx --build-dir=/mnt/bigdisk/ngx-build(需 Nginx 1.21+ 支持--build-dir) - 禁用调试符号减小体积:
./configure --without-debug ...,可节省 30%+ object 文件大小
编译后清理与长期预防
即使成功编译,临时文件仍可能滞留,影响后续构建:
- 编译完成后运行:
make clean清理 objs/ 目录;手动删掉 configure 生成的Makefile和objs/外的临时文件 - 将
/tmp挂载为独立小分区(如 ext4)而非 tmpfs,避免内存挤占 - 在 CI/CD 或自动化脚本中加入空间检查:
[ $(df -B1 . | awk 'NR==2 {print $4}') -lt 524288000 ] && echo "Less than 500MB free" && exit 1











