You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

t2.micro实例上Next.js构建卡住及实例无法启动问题排查

问题原因
  • t2.micro资源瓶颈:t2.micro仅配备1GB内存,Next.js构建过程(依赖安装、代码编译、静态资源处理)会占用大量内存,内存耗尽后进程进入无响应状态,甚至触发系统OOM(内存不足)杀手,导致实例异常关机后启动失败。
  • 本地构建产物冗余:600MB的构建产物大概率包含node_modules、.next缓存、未优化的静态资源等冗余文件,这类文件不适合上传GitHub(会导致克隆缓慢、挤占实例磁盘),且进一步加剧实例资源紧张。
  • 进程僵死与文件系统损坏:内存耗尽导致构建进程僵死,Ctrl+C无法终止;强制关闭实例可能破坏文件系统元数据,引发实例启动失败。
解决步骤

一、恢复无法启动的EC2实例

  1. 停止故障实例,分离其根EBS卷。
  2. 创建一个新的EC2实例(建议用t2.small临时过渡),作为恢复环境。
  3. 将分离的故障卷挂载到临时实例的挂载点(如/mnt/recovery)。
  4. 检查并修复文件系统:
    sudo fsck /dev/xvdf # 替换为实际挂载的设备名
    
  5. 修复完成后卸载故障卷,重新挂载回原实例并启动。若仍无法启动,从临时实例备份代码后重新创建实例。

二、适配t2.micro的Next.js构建优化

  1. 添加Swap分区缓解内存不足:
    # 创建4GB Swap文件
    sudo fallocate -l 4G /swapfile
    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    sudo swapon /swapfile
    # 设置开机自动挂载
    echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
    
  2. 优化依赖安装与构建命令:
    • 用npm ci替代npm i,跳过缓存减少磁盘占用:
      npm ci --only=production
      
    • 修改next.config.js启用精简构建:
      module.exports = {
        output: 'standalone', // 生成独立运行的精简产物
        images: { unoptimized: true }, // 禁用图片优化(按需选择)
        compress: true // 开启静态资源压缩
      }
      
    • 构建时限制Node.js内存使用:
      NODE_OPTIONS="--max-old-space-size=8192" npm run build
      
  3. 清理冗余文件,规范GitHub上传:
    在项目根目录创建.gitignore,排除不必要的文件:
    node_modules/
    .next/
    .env.local
    *.log
    dist/
    
    仅上传源码、配置文件和核心静态资源,构建过程在EC2实例完成。

三、长期优化方案

  • 升级实例规格:若项目规模较大,升级到t2.small(2GB内存)或更高配置,从根源解决资源不足问题。
  • CI/CD云端构建:通过GitHub Actions等工具在云端完成构建,将精简后的产物(如standalone模式)部署到EC2,避免在实例上消耗资源。
  • 静态资源托管到S3:将图片、视频等大型静态资源上传到S3,通过CDN分发,减少项目产物大小和实例磁盘占用。

内容的提问来源于stack exchange,提问作者AVINASH KUMAR SINGH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:12:41