Linux服务器运行Next.js项目执行npm run dev/build报EAGAIN错误如何解决
问题原因
你遇到的EAGAIN是Linux系统级报错,含义是系统当前无法分配足够资源创建新的子进程,和服务器进程数上限不足、内存不够、Next.js默认多进程构建并发数过高,或者共享NFS存储IO延迟有关。
解决方案
限制Next.js构建/运行的并发worker数
Next.js默认会调用和CPU核心数等量的子进程做构建/运行处理,共享服务器通常会限制单用户进程数,直接执行会触发资源上限。执行命令时手动指定并发数即可:# 构建时指定1个worker NEXT_PRIVATE_WORKER_CONCURRENCY=1 npm run build # 开发运行时指定1个worker NEXT_PRIVATE_WORKER_CONCURRENCY=1 npm run dev也可以将配置写入项目根目录的
next.config.js:module.exports = { experimental: { workerThreads: false, cpus: 1 } }调整系统用户进程数上限
执行ulimit -u查看当前单用户允许的最大进程数,如果数值低于256,可先临时调整:ulimit -u 1024永久调整需要编辑
/etc/security/limits.conf,添加以下配置后重启生效:your_username soft nproc 1024 your_username hard nproc 2048如果是学校/企业共享服务器,无权限修改配置可联系管理员调整进程数限制。
检查内存并补充交换分区
执行free -h查看服务器剩余内存,如果可用内存低于512M,可临时新增1G交换分区缓解内存压力:fallocate -l 1G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile无权限创建交换分区的场景优先使用第一种限制并发的方案。
更换运行目录
你当前的项目存放在NFS共享存储目录下,NFS的IO延迟可能导致子进程阻塞堆积,触发资源上限。可以先把项目移动到服务器本地磁盘目录完成构建,再将构建产物复制回NFS目录部署。调整Node.js版本
你当前使用的Node.js v16.13.0存在已知的子进程资源泄漏问题,可以升级到Node.js 16.x最新LTS版本,或适配当前Next.js版本的更高LTS Node.js版本。
内容的提问来源于stack exchange,提问作者PesceJonathan

