Skip to content

PM2 프로세스 매니져로 Next.js / Express.js 애플리케이션 프로덕션 배포하기

작성일: at 오전 06:54

Table of contents

Open Table of contents

SharedLocker (스마트 공유 보관함)

스마트 공유 보관함 (SharedLocker) 프로젝트의 프로덕션 빌드 및 배포를 준비하면서 공부한 내용을 설명합니다.

해당 프로젝트는 크게 네 가지 부분으로 구성되어 있다.

여기서는 위 목록 중 첫 번째와 두 번째 프로젝트를 배포하는 과정에 대해 설명하겠다.

Node.js + Express.js API 서버 배포하기

PM2는 Node.js로 작성된 서버 프로그램을 무중단 배포하기 위한 프로세스 매니저이다.

프로세스 재시작, Cluster와 같은 주요 기능을 제공한다.

ecosystem 기능으로 프로젝트 루트에 PM2를 위한 설정 파일을 생성할 수 있다.

프로젝트의 루트 위치에서 아래 명령을 실행하면 ecosystem.config.js 파일이 생성된다.

pm2 ecosystem

파일 내용은 아래와 같이 작성했다.

module.exports = {
  apps: [{
    name: 'sharedLocker-product',
    script: './public/dist/server.js',
    env: {
      NODE_ENV: 'production'
    },
    output: './logs/pm2/console.log',
    error: './logs/pm2/error.log',
  }, {
    name: 'sharedLocker-dev',
    script: './public/dist/server.js',
    env: {
      NODE_ENV: 'development'
    },
    output: './logs/pm2/dev/console.log',
    error: './logs/pm2/dev/error.log'
  }],
};

apps 속성에 배열 형태로 여러 개의 설정을 정의할 수 있는데, 실행 명령어의 --only 속성으로 특정 app만 실행할 수 있다.

pm2 start ecosystem.config.cjs --only sharedLocker-product --env production

참고로, 프로젝트의 package.json의 type 속성이 module인 경우 cjs 확장자를 사용해야 한다.

위 명령어를 npm scripts로 등록하면 명령어를 간편하게 실행할 수 있다.

Next.js 배포하기

Next.js는 Node.js 앱과 달리, Entry file이 없고 next start 명령어를 통해 프로젝트를 시작할 수 있다.

따라서 ecosystem 파일에 script와 args 속성으로 npm scripts에 정의된 명령을 실행할 수 있도록 설정해야 한다.

module.exports = {
  apps: [{
    name: 'sharedLocker-next-product',
    script: 'npm',
    args: 'run start',
    env: {
      NODE_ENV: 'production'
    },
    output: './logs/pm2/console.log',
    error: './logs/pm2/error.log',
  }, {
    name: 'sharedLocker-next-dev',
    script: 'npm',
    args: 'run dev',
    env: {
      NODE_ENV: 'development'
    },
    output: './logs/pm2/dev/console.log',
    error: './logs/pm2/dev/error.log'
  }],
};

npm run startnpm run dev를 실행하기 위해 위와 같이 설정한다.

"scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint",
    "deploy:dev": "next build && pm2 startOrRestart ecosystem.config.js --only sharedLocker-next-dev --env dev",
    "deploy:prod": "next build && pm2 startOrRestart ecosystem.config.js --only sharedLocker-next-product --env prod"
},

마지막으로 npm scripts에 명령어를 등록하면 완료.

참고 문헌

https://pm2.keymetrics.io/docs/usage/application-declaration/#general

https://dykraf.com/blog/deploying-nextjs-web-application-with-pm2

https://inpa.tistory.com/entry/node-📚-PM2-모듈-사용법-클러스터-무중단-서비스#pm2_설정_파일로_관리하기