在cPanel部署AdonisJS+NextJS+ReactJS遇jest-worker EAGAIN错误求助
cPanel部署AdonisJS+NextJS+ReactJS项目报错求助
错误日志
events.js:291 throw er; // Unhandled 'error' event ^ Error: spawn /opt/alt/alt-nodejs12/root/usr/bin/node EAGAIN at Process.ChildProcess._handle.onexit (internal/child_process.js:268:19) at onErrorNT (internal/child_process.js:470:16) at processTicksAndRejections (internal/process/task_queues.js:84:21) Emitted 'error' event on ChildProcess instance at: at Process.ChildProcess._handle.onexit (internal/child_process.js:274:12) at onErrorNT (internal/child_process.js:470:16) at processTicksAndRejections (internal/process/task_queues.js:84:21) { errno: 'EAGAIN', code: 'EAGAIN', syscall: 'spawn /opt/alt/alt-nodejs12/root/usr/bin/node', path: '/opt/alt/alt-nodejs12/root/usr/bin/node', spawnargs: [ '/home/test123/nodevenv/repositories/testproject/12/lib/node_modules/jest-worker/build/workers/processChild.js' ] }
项目配置文件
server.js
'use strict' const { Ignitor } = require('@adonisjs/ignitor') new Ignitor(require('@adonisjs/fold')) .appRoot(__dirname) .fireHttpServer() .catch(console.error)
next.config.js
'use strict' const next = require('next') const { withPlugins } = require('next-compose-plugins') const withOffline = require('next-offline') require('dotenv').config() const nextWithOfflineConfig = { dontAutoRegisterSw: false, generateInDevMode: false, workboxOpts: { swDest: './next/.next/service-worker.js', runtimeCaching: [ { urlPattern: /^https?.*/, handler: 'NetworkFirst', options: { cacheName: 'https-calls', networkTimeoutSeconds: 15, expiration: { maxEntries: 150, maxAgeSeconds: 1 * 24 * 60 * 60, // 1 day }, cacheableResponse: { statuses: [0, 200], }, }, }, ], debug: false, }, } const nextEnv = { env: { APP_KEY: process.env.APP_KEY, } } module.exports = withPlugins([ [withOffline, { nextWithOfflineConfig }], [nextEnv] ])
package.json核心依赖
"next": "^10.0.9", "next-compose-plugins": "^2.2.1", "next-offline": "^5.0.3", "next-page-transitions": "^1.0.0-beta.2", "next-pwa": "^5.2.21", "react": "^17.0.2"
cPanel环境信息
- Node.js版本:12.22.9
- npm版本:6.14.0
已尝试的无效操作
- 删除
node_modules目录:rm -rf node_modules - 删除依赖锁文件:
rm package-lock.json yarn.lock - 清空npm缓存:
npm cache clear --force - 重新安装依赖:
npm install
解决方案建议
1. 排查系统资源限制(EAGAIN核心原因)
EAGAIN错误本质是系统无法分配足够资源创建新进程,cPanel虚拟主机通常有进程数、内存限制:
- 登录cPanel查看
资源使用面板,确认是否触发进程数上限或内存不足 - 若进程数超标,关闭不必要的后台进程;若内存不足,联系主机商升级套餐或调整配额
2. 优化Next.js构建/运行的进程占用
- 移除冲突的PWA插件:同时安装
next-offline和next-pwa会导致功能重叠与额外进程开销,建议保留其中一个(推荐维护更活跃的next-pwa),删除另一个后重新安装依赖 - 禁用Jest Worker多进程:错误日志来自
jest-worker,可通过环境变量强制单进程运行:
在cPanel的export NODE_OPTIONS="--max-workers=1"设置环境变量面板添加该变量,或在启动脚本中加入
3. 调整Node.js版本与依赖兼容性
- Node.js 12.x对Next.js 10.x部分特性支持有限,尝试在cPanel中通过
Select Node.js Version切换到14.x版本(需确保兼容项目依赖) - 升级Next.js到10.x最新补丁版本,修复已知进程启动bug:
npm install next@10.0.13 --save
4. 修改AdonisJS启动方式
- 增强
server.js的错误捕获能力,避免未处理事件导致崩溃:'use strict' const { Ignitor } = require('@adonisjs/ignitor') const ignitor = new Ignitor(require('@adonisjs/fold')).appRoot(__dirname) ignitor.fireHttpServer() .catch((err) => { console.error('Server error:', err) process.exit(1) }) - 以生产模式启动项目,减少开发模式的资源消耗:
NODE_ENV=production node server.js
内容的提问来源于stack exchange,提问作者Mr-T
相关产品推荐
相关产品推荐

