클러스터 모드에서 next.js 실행하기(매우 간단함)

솔직히 저는 바보 같은 느낌이 듭니다. 저는 지난 몇 년 동안 Next.js 앱을 유지 관리해 왔으며 Next.js가 프로덕션 환경에서 자동으로 클러스터링되어 실행된다고 생각했습니다.

게다가 클러스터화된 Next.js를 실행하기 위한 좋은 솔루션을 찾지 못했습니다. 모든 것이 수많은 코드로 인해 지나치게 복잡합니다.

글쎄요, (최소한 Next 12의 경우) 그것은 정말 간단합니다. 그리고 Google은 저에게 좋은 대답을 주지 않았기 때문에 오늘 혼자 조사해야 했습니다.

따라서 솔루션은 다음과 같습니다. 주로 노드cluster 문서를 기반으로 합니다.

const cluster = require('node:cluster');
const process = require('node:process');
const { cpus } = require('node:os');

const numCPUs = cpus().length;

if (cluster.isPrimary) {
  console.log(`Primary ${process.pid} is running`);
  // all the magic goes here. 
  // `setupPrimary` is altering cluster behaviour
  // see docs: https://nodejs.org/api/cluster.html#clustersetupprimarysettings
  cluster.setupPrimary({
    // node_modules/.bin is directory for all runtime scripts,
    // including `next`.
    // we can work with it like with a common node package,
    // so require.resolve simply gives us path for `next` CLI 
    exec: require.resolve('.bin/next'),
    // args should skip first 2 arguments, 
    // "node" path and file to execute path
    args: ['start', ...process.argv.slice(2)],
    // just directly passing all the IO to not handle pipes
    stdio: 'inherit',
    // making stdout and stderr colored
    shell: true,
  });

  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`, { code, signal });
  });
}

// we do not need to do "else" here as cluster will run different file

좋은 웹페이지 즐겨찾기