일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- config
- yona
- submit
- Maven
- nodejs
- MariaDB
- jenkins
- popup
- MSsql
- git
- PM2
- spring
- docker
- Java
- NextJS
- spring3
- post
- node.js
- security
- SpringBoot
- ajax
- Next.js
- javascript
- console
- mybatis
- Eclipse
- jquery
- rocky9
- mysql
- centos7
- Today
- Total
ふたりで
pm2 cluster + nextJS 본문
nextJS 프로젝트를 pm2 cluster 모드로 구동시켜 보기.
해당 글은 아래의 링크를 참조하여 작성되었습니다.
https://pm2.keymetrics.io/docs/usage/cluster-mode/
# 프로젝트 환경은 다음과 같다.
- 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'
},
}
]
}
# 다음으로 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까지 도입 할 필요는 없을 것 같긴 한데...
'node.js' 카테고리의 다른 글
nodejs OR nextjs 에서의 new Date 사용시 참고. (0) | 2024.09.04 |
---|---|
pm2-logrotate Downgrade v2.7.0 to v2.6.0 (0) | 2024.04.17 |
pm2 특정 app프로세스 강제 종료 및 초기화. (0) | 2024.03.19 |
pm2-logrotate (pm2 log 관리) (0) | 2024.03.13 |
node.js MSSQL 접속 테스트용 소스 (0) | 2024.02.26 |