티스토리 뷰

반응형

PM2는 Node를 기반으로 하는 프로세스 매니저입니다. Node.js의 특성상 단일 CPU 코어에서 실행되기 때문에 CPU 멀티코어 시스템은 사용할 수 없지만, Non-Blocking I/O 모델을 지원하는 Node의 특성상 가볍고 성능이 뛰어납니다. 한 개의 코어만 사용하는 Node를 해결하기 위해 클러스터 모듈을 통해 단일 프로세스의 Worker를 늘려 멀티 프로세스처럼 사용할 수 있도록 합니다. 

그렇다보니 Node 서비스를 운영하는데에는 혹시 모르는 불안함이 있기 때문에 그러한 경우 에러 핸들링과 코드 재배포, 서버 리부팅 등과 같이 고민하고자 하는 부분을 해결하기 위해서 PM2 를 도입합니다. 

PM2의 설치 방법은 다른 노드 모듈을 설치하는 것과 같습니다.

$ npm i -g pm2

사용방법

app.js

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
   res.send('OK')
})

app.listen(port)

그리고 커맨드 라인에서 다음과 같이 실행해줍니다. 

$ pm2 start app.js

이를 package.json에 넣어서 실행 명령어로도 사용할 수 있습니다. 

package.json

{
  "name": "node-express",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "nodemon app.js",
 +  "pm2" : "pm2 start app.js"
  },
  ...
}

$ npm start pm2

 

클러스터링 모드 적용

이제 설치 및 실행이 되는 것을 체크하였고, 실제로 운영중인 서버의 프로세스 상태를 확인하기 위한 세팅을 진행하고자 합니다. 가장 먼저 Process Configuration File을 생성합니다.

$ vi processes.config.js
module.exports = {
   apps: [{
      name: 'app',
      script: './app.js',
      instances: 0,
      exec_mode: 'cluster'
   }]
}

그리고 package.json 내의 script 부분에 수정또한 필요합니다.

{
  "name": "node-express",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "nodemon app.js",
 -  "pm2" : "pm2 start app.js"
 +  "pm2" : "pm2 start processes.config.js"
  },
  ...
}

 

클러스터링 프로세스 개수 증감

위와 같이 클러스터모드로 실행되면 하나의 cpu만 사용하는 문제를 해결할 수 있습니다. 만약 프로세스 개수를 늘리거나 줄여야한다면 pm2 scale 명령어를 사용할 수 있습니다. 또, 프로세스를 재시작하고 상태를 체크할 수도 있습니다.

# 프로세스 4개 늘리기
$ pm2 scale app +4

# 프로세스 3개 줄이기
$ pm2 scale app 4

# 프로세스 재시작
$ pm2 reload app

# 프로세스 상태 표시
$ pm2 list

 

반응형
댓글
공지사항