프로그래밍 언어/NODE JS

pm2(1)

· 코딩마이데이

pm2는 활한 서버 운영을 위한 패키지입니다. '개발할 때 nodemon을 쓴다면, 배포할 때는 pm2를 쓴다'는 말이 있을 정도로 유용합니다. 가장 큰 기능은 서버가 에러로 인해 꺼졌을 때 서 버를 다시 켜주는 것입니다.
또 하나의 중요한 기능은 바로 멀티 프로세싱입니다. 멀티 스레딩은 아니지만 멀티 프로세싱을 지 원하여 노드 프로세스 개수를 한 개 이상으로 늘릴 수 있습니다. 기본적으로는 CPU 코어를 하나 만 사용하는데, pm2를 사용해서 프로세스를 여러 개 만들면 다른 코어들까지 사용할 수 있습니다. 클라이언트로부터 요청이 올 때 알아서 요청을 여러 노드 프로세스에 고르게 분배합니다. 하 나의 프로세스가 받는 부하가 적어지므로 서비스를 더 원활하게 운영할 수 있습니다.
단점도 있습니다. 멀티 스레딩이 아니므로 서버의 메모리 같은 자원을 공유하지는 못합니다. 지금 까지 세션을 메모리에 저장했는데, 메모리를 공유하지 못해서 프로세스 간에 세션이 공유되지 않 게 됩니다. 로그인 후 새로고침을 반복할 때 세션 메모리가 있는 프로세스로 요청이 가면 로그인 된 상태가 되고, 세션 메모리가 없는 프로세스로 요청이 가면 로그인되지 않은 상태가 되는 것입 니다.
이 문제를 극복하기 위해서는 세션을 공유할 수 있게 해주는 무언가가 필요합니다. 이를 위해 주로 멤캐시드나 레디스 같은 서비스를 사용합니다.
NodeBird 앱 폴더에서 콘솔을 실행한 후 pm2를 설치합니다.

$ npm i pm2

 

pm2는 nodemon처럼 콘솔에 입력하는 명령어입니다. package.json을 수정합니다. nodemon 대신 pm2를 쓰도록 npm start 스크립트를 수정할 것입니다.

{
  "name": "nodebird",
  "version": "0.0.1",
  "description": "익스프레스로 만드는 SNS 서비스",
  "main": "server.js",
  "scripts": {
    "start": "cross-env NODE_ENV=production PORT=80 pm2 start server.js",
    "dev": "nodemon server",
    "test": "jest"
  },
  "author": "ZeroCho",
  "license": "MIT",
  "dependencies": {
    "bcryptjs": "^3.0.3",
    "cookie-parser": "^1.4.3",
    "cross-env": "^10.1.0",
    "csrf": "^3.1.0",
    "dotenv": "^8.2.0",
    "express": "^4.16.3",
    "express-session": "^1.15.6",
    "morgan": "^1.9.1",
    "multer": "^1.4.2",
    "mysql2": "^2.0.2",
    "nunjucks": "^3.2.0",
    "passport": "^0.4.0",
    "passport-kakao": "1.0.0",
    "passport-local": "^1.0.0",
    "pm2": "^6.0.14",
    "sanitize-html": "^2.17.2",
    "sequelize": "^5.21.3",
    "sequelize-cli": "^5.5.1"
  },
  "devDependencies": {
    "jest": "^24.9.0",
    "nodemon": "^2.0.2",
    "supertest": "^4.0.2"
  }
}

 

start 스크립트에 node server 대신 pm2 start server.js를 입력했습니다. pm2로 스크립트를 실행하는 명령어입니다.

이제 바뀐 명령어를 실행해보겠습니다. 컴퓨터에 따라 결과 화면이 다를 수 있습니다.

$ npm start

npm start 명령 실행 화면

 

pm2를 실행했더니 다른 점이 있습니다. node나 nodemon 명령어와는 다르게  노드 프로세스가 실행된 후에 콘솔에 다른 명령어를 입력할 수 있습니다. pm2가 노드 프로세스를 백그라운드로 돌리므로 가능한 것입니다.

 

'프로그래밍 언어 > NODE JS' 카테고리의 다른 글

winston  (0) 2026.04.23
pm(2)  (0) 2026.04.20
sanitize-html, csurf  (0) 2026.04.14
시퀄라이즈: cross-env  (1) 2026.04.12
AWS와 GCP로 배포하기 - 서비스 운영을 위한 패키지(2)  (0) 2026.04.09