Ubuntu 18.04下Angular Universal生产SSR构建卡16%报137,本地可正常编译
报错根因
- 终端输出的
Killed标记、退出码137,是Ubuntu系统OOM(内存耗尽)保护机制的典型表现:当系统检测到可用内存不足时,会强制终止当前资源占用最高的进程,避免整机无响应宕机。 - 构建流程卡在16%处理
@angular/core模块阶段被中断,是因为Angular生产构建、尤其是SSR双端包编译过程,对Node进程的内存需求较高;本地开发环境通常内存配置更充足,而低配服务器(常见1G/2G内存的云主机)物理内存远达不到构建需求,加上Node进程的默认堆内存上限是根据运行环境物理内存自动适配的,低配环境下自动算出的堆内存阈值远低于构建实际需要,就会出现本地能正常编译、服务器上构建被强制终止的情况。
可落地的解决思路
- 先清理服务器现有内存占用
执行命令释放系统缓存:sudo sync; sudo echo 3 > /proc/sys/vm/drop_caches
同时临时停掉服务器上运行的其他高内存常驻进程(比如已在运行的项目实例、占满内存的数据库连接),腾出基础内存空间。 - 调整Node进程的内存配置上限
修改项目package.json中的build:ssr脚本,增加Node的内存分配参数,避免无限制申请内存触发OOM:
原脚本内容:"build:ssr": "ng build --prod && ng run project:server:production"
修改后内容:"build:ssr": "NODE_OPTIONS=\"--max-old-space-size=2048\" ng build --prod && ng run project:server:production"
这里的2048代表给Node构建进程分配2G的堆内存上限,具体数值要根据服务器实际剩余内存调整,不要设置为超过总物理内存的70%,要留足系统本身运行需要的基础内存。 - 配置Swap交换分区做兜底
如果服务器物理内存只有1G/2G,无法覆盖构建时的内存峰值,可以创建2G大小的交换分区,用硬盘空间模拟临时内存兜底:
依次执行命令:
配置完成后再重新执行构建命令,即便内存短暂达到峰值,也会通过交换分区过渡,不会直接杀掉构建进程。sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile - 优化方案:如果服务器配置实在过低,不适合直接在服务器上执行编译流程,可以把SSR项目的构建环节放到本地环境或CI流水线完成,将最终编译产物直接上传到服务器运行,完全跳过服务器端的编译步骤。
内容的提问来源于stack exchange,提问作者esteban rua
相关产品推荐
相关产品推荐

