ふたりで

pm2 cluster + nextJS 본문

node.js

pm2 cluster + nextJS

graykang 2024. 4. 15. 15:43
728x90
반응형
SMALL

nextJS 프로젝트를 pm2 cluster 모드로 구동시켜 보기.

해당 글은 아래의 링크를 참조하여 작성되었습니다.

https://pm2.keymetrics.io/docs/usage/cluster-mode/

 

PM2 - Cluster Mode

Advanced process manager for production Node.js applications. Load balancer, logs facility, startup script, micro service management, at a glance.

pm2.keymetrics.io

# 프로젝트 환경은 다음과 같다.

- nextjs v14

- nodejs v20

- rocky9 linux

- pm2 v5

 

# pm2로 nextjs 앱을 구동시키는 명령어에 따라 cluster 모드설정이 달라질 수 있다.

나의 경우 아래와 같은 명령어로 실행했었다.

: pm2 start npm --name "appGraykang" --watch -- run real

 

# 먼저 프로젝트의 package.json과 같은 위치에 ecosystem.config 파일을 아래와 같이 만든다.

참고: dev모드로 구동시켜야 할 경우 별도로 dev.ecosystem.config 파일을 만들고 env 설정값만 수정해서

사용할 수도 있다. 해당 설정 파일의 자세한 옵션은 pm2공식 페이지를 참조하자.

//ecosystem.config.js
module.exports = {
    apps: [
        {
            name: 'appGraykang', //앱이름
            script: 'server.js', //https, redis, nextjs 등을 사용하기 위한 중요 스트립트 파일
            instances: 0,  // 사용할 CPU수 0일경우 가용CPU모두 사용
            exec_mode: 'cluster', // 클러스터 모드로 실행
            watch: true, // 자동재시작 옵션
             env: {
                NODE_ENV: 'production'
            },
       }
    ]
}

//dev.ecosystem.config.js
module.exports = {
    apps: [
        {
            name: 'appGraykang',
            script: 'server.js',
            instances: 0,
            exec_mode: 'cluster',
            watch: true,
            env: {
                NODE_ENV: 'development'
            },
        }
    ]
}
728x90
반응형
SMALL

# 다음으로 package.json 파일을 열어 아래와 같이 scripts 부분에 agrs를 추가한다.

추가한 부분은 real-eco, dev-eco 부분이다.

dev2, real 부분은 명령어로 기존에 실행할 때 참조되던 것들이다.

{
  "name": "appGraykang",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next build && next start -p 3000",
    "dev-eco": "npm run build && pm2 reload dev.ecosystem.config.js && NODE_ENV='development'",
    "real-eco": "npm run build && pm2 reload ecosystem.config.js && NODE_ENV='production'",
    "dev2": "next build && NODE_ENV='development' node server.js",
    "real": "next build && NODE_ENV='production' node server.js"
  },
  "dependencies": {
    "@types/formidable": "^3.4.5",
    "@types/node": "20.5.0",
    .
    .
    .
    .
    },
    "devDependencies": {
    .
    .
    .
    }
 }

 

# 이제 아래 명령어로 실행을 해보자.

pm2 start ./dev.ecosystem.config.js
[graykang@localhost appGraykang]$ pm2 start ./dev.ecosystem.config.js
[PM2] Spawning PM2 daemon with pm2_home=/home/dev/.pm2
[PM2] PM2 Successfully daemonized
[PM2][Module] Starting NPM module pm2-logrotate
[PM2][WARN] Applications pm2-logrotate not running, starting...
[PM2] App [pm2-logrotate] launched (1 instances)
[PM2][WARN] Applications appRelaySvc not running, starting...
[PM2] App [appGraykang] launched (12 instances)
┌────┬──────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name             │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├────┼──────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 1  │ appGraykang      │ default     │ 0.1.0   │ cluster │ 2772172  │ 1s     │ 0    │ online    │ 0%       │ 96.8mb   │ gray...  │ enabled  │
│ 2  │ appGraykang      │ default     │ 0.1.0   │ cluster │ 2772179  │ 1s     │ 0    │ online    │ 0%       │ 95.6mb   │ gray...  │ enabled  │
│ 3  │ appGraykang      │ default     │ 0.1.0   │ cluster │ 2772186  │ 1s     │ 0    │ online    │ 0%       │ 92.3mb   │ gray...  │ enabled  │
│ 4  │ appGraykang      │ default     │ 0.1.0   │ cluster │ 2772197  │ 1s     │ 0    │ online    │ 0%       │ 88.7mb   │ gray...  │ enabled  │
│ 5  │ appGraykang      │ default     │ 0.1.0   │ cluster │ 2772210  │ 0s     │ 0    │ online    │ 0%       │ 85.6mb   │ gray...  │ enabled  │
│ 6  │ appGraykang      │ default     │ 0.1.0   │ cluster │ 2772221  │ 0s     │ 0    │ online    │ 0%       │ 84.3mb   │ gray...  │ enabled  │
│ 7  │ appGraykang      │ default     │ 0.1.0   │ cluster │ 2772233  │ 0s     │ 0    │ online    │ 0%       │ 75.5mb   │ gray...  │ enabled  │
│ 8  │ appGraykang      │ default     │ 0.1.0   │ cluster │ 2772245  │ 0s     │ 0    │ online    │ 0%       │ 71.3mb   │ gray...  │ enabled  │
│ 9  │ appGraykang      │ default     │ 0.1.0   │ cluster │ 2772261  │ 0s     │ 0    │ online    │ 0%       │ 66.9mb   │ gray...  │ enabled  │
│ 10 │ appGraykang      │ default     │ 0.1.0   │ cluster │ 2772273  │ 0s     │ 0    │ online    │ 0%       │ 61.3mb   │ gray...  │ enabled  │
│ 11 │ appGraykang      │ default     │ 0.1.0   │ cluster │ 2772285  │ 0s     │ 0    │ online    │ 0%       │ 60.0mb   │ gray...  │ enabled  │
│ 12 │ appGraykang      │ default     │ 0.1.0   │ cluster │ 2772296  │ 0s     │ 0    │ online    │ 0%       │ 57.3mb   │ gray...  │ enabled  │
└────┴──────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
Module
┌────┬──────────────────────────────┬───────────────┬──────────┬──────────┬──────┬──────────┬──────────┬──────────┐
│ id │ module                       │ version       │ pid      │ status   │ ↺    │ cpu      │ mem      │ user     │
├────┼──────────────────────────────┼───────────────┼──────────┼──────────┼──────┼──────────┼──────────┼──────────┤
│ 0  │ pm2-logrotate                │ 2.7.0         │ 2772163  │ online   │ 0    │ 57.3%    │ 69.8mb   │ gray...  │
└────┴──────────────────────────────┴───────────────┴──────────┴──────────┴──────┴──────────┴──────────┴──────────┘
[PM2][WARN] Current process list is not synchronized with saved list. App appSvr differs. Type 'pm2 save' to synchronize.
[graykang@localhost appGraykang]$

 

잘 실행이 되었다. 

ecosystem.config.js 파일에서 instances 옵션을 0 또는 "max"로 줄경우 가용한 CPU코어를 모두 사용하게끔 구동된다.

나의 경우 개발서버의 cpu코어를 12개 전부 다 물고 올라왔다.

 

헛!! 하지만 각 프로세스 간에 상태값 및 정보 공유가 안 되는 것 같다 프로세스 각각의 서비스처럼 동작을 해버린다...

쉣더ㅍ...;;;;

 

# pm2 cluster 모드는 각 CPU/memory별  앱서비스가 별도로 구동된다고 한다...

해서 실무에서 사용을 하려면 메모리 공유를 통해 하나의 서비스처럼 동작하게 설정이 필요하단다...

관련해서는 Redis를 도입해야 한단다...

이 부분은 좀 더 학습과 헤딩이 필요한 상황이다...

당분간은 cluster모드로 운영할 순 없을 것 같다...

음...단순 API의 경우 굳이 Redis까지 도입 할 필요는 없을 것 같긴 한데...

728x90
반응형
LIST
Comments