Nginx源码编译make阶段内存不足本质是GCC并发构建耗尽物理或虚拟内存,非Nginx缺陷;需据报错特征(如cc1: out of memory)、free -h可用值、swap启用状态、ulimit限制及htop观察定位,优先降make并发数(如-j1)、精简模块、禁用-debug、降优化级-O1。

Nginx 源码编译时 make 阶段报内存不足,本质是 GCC 编译器在并发构建中耗尽了可用物理内存或虚拟内存,不是 Nginx 自身缺陷,而是构建环境与策略不匹配。关键要快速识别现象、定位瓶颈、针对性降压。
看报错特征是否指向内存溢出
这类错误不会说“请加内存”,而是由编译器或内核抛出底层失败信号:
-
cc1: out of memory allocating 1234567 bytes -
g++: internal compiler error: Killed (program cc1plus) -
virtual memory exhausted: Cannot allocate memory - 终端突然退出,
dmesg -T | tail显示Killed process XXX (cc1) ... total-vm:XXXXXXkB, anon-rss:XXXXXXkB -
make进程被静默终止,无明确错误但构建中断
只要出现上述任意一种,基本可锁定为内存资源瓶颈。
检查系统真实可用资源
别只看“还有 500MB”,要看编译时能否稳定撑住瞬时峰值:
- 运行
free -h,重点关注available值;低于 1.2GB 就高风险 - 执行
swapon --show,确认 Swap 已启用;没开 Swap 的 1–2GB 内存机器几乎必败 - 用
ulimit -v查虚拟内存限制,若输出是具体数字(如2097152),说明被限制在 2GB,运行ulimit -v unlimited临时放开 - 编译时开一个终端跑
htop,过滤cc1或gcc,观察单个进程 RSS 是否冲到 500MB+
降低 make 并行度是最有效手段-j 参数是最大放大器,尤其在多核小内存设备上:
- 禁止使用
make -j$(nproc)或make -j(无参数) - 优先试
make -j1:串行编译,内存最省,适合 1GB VPS 或 CI 环境 - 折中选
make -j$(($(nproc)/2 + 1)),例如 4 核机器用-j3,8 核用-j5 - 若仍失败,直接固定为
make -j2,兼顾速度与稳定性
精简配置减少内存压力
每个模块、每级优化都在吃内存:
- 移除非必要模块:不用 HTTP/2 就删
--with-http_v2_module;不用 GeoIP 就不加--with-http_geoip2_module - 禁用调试符号:去掉
--with-debug;真要调试,改用--with-cc-opt="-g1" - 降 GCC 优化等级:在
./configure后追加--with-cc-opt="-O1",比默认-O2节省约 30% 编译内存 - 清理旧构建残留:
make clean && rm -rf objs/,避免巨量.o文件叠加占用
不复杂但容易忽略


















