Node.js는 기본적으로 싱글 스레드(thread)로 돌아간다.
Node.js 애플리케이션은 단일 CPU 코어에서 실행되기 때문에 CPU의 멀티코어 시스템은 사용할 수 없다.
그래서 만약 서버의 사양이 8코어이며 16쓰레드면, 프로그램을 돌리는데 최대 16개 코어를 사용 할 수 있지만, 노드는 싱글 스레드 이기 때문에 모든 코어를 사용하지 못해 최대 성능을 내지 못하는, 즉 자원을 제대로 활용하지 못한다.
그래서 Node.js는 이런 문제를 해결하기 위해 클러스터(Cluster) 모듈Visit Website을 통해 단일 프로세스를 멀티 프로세스(Worker)로 늘릴 수 있는 방법을 제공한다. 개발자는 클러스터 모듈을 사용해서 마스터 프로세스에서 코어 수만큼 워커 프로세스를 생성해서 모든 코어를 사용하게끔 로직을 짜면, 자원 낭비 없이 서버를 돌릴수 있다.
PM2는 P(Process) M(Manager) 2의 약자로 NodeJS 프로세서를 관리하는 원활한 서버 운영을 위한 패키지 이다.
개발할 떄 우리가 자주쓰는 Nodemon 사용한다면 배포할 떄는 pm2 사용한다.
$ npm install -g pm2 # pm2 설치
$ yarn add -g pm2 # pm2 설치
module.exports = {
/* apps 항목은 우리가 pm2에 사용할 옵션을 기재 */
apps: [
{
name: 'projectName', // app이름
script: './index.js', // 실행할 스크립트 파일
instances: 2, // cpu 코어수 만큼 프로세스 생성 (instance 항목값을 ‘0’으로 설정하면 CPU 코어 수 만큼 프로세스를 생성)
exec_mode: 'cluster', // 클러스터 모드
max_memory_restart: '300M', // 프로세스의 메모리가 300MB에 도달하면 reload 실행
watch: ['bin', 'routes'], //bin폴더, routes폴더를 감시해서 변경사항 실행
ignore_watch: ['node_modules'], // 반대로 해당폴더의 파일변경은 무시
env: {
// 환경변수 지정
Server_PORT: 4000,
NODE_ENV: 'development',
Redis_HOST: 'localhost',
Redis_PORT: 6379,
},
output: '~/logs/pm2/console.log', // 로그 출력 경로 재설정
error: '~/logs/pm2/onsoleError.log', // 에러 로그 출력 경로 재설정
},
],
/* deploy는 원격 서버와 git을 연동해서 배포하는 방식 */
deploy: {
production: {
user: 'SSH_USERNAME',
host: 'SSH_HOSTMACHINE',
ref: 'origin/master',
repo: 'GIT_REPOSITORY',
path: 'DESTINATION_PATH',
'pre-deploy-local': '',
'post-deploy': 'npm install && pm2 reload ecosystem.config.js --env production',
'pre-setup': '',
},
},
};
서비스를 오픈 이후에도 여러 상황 변화에 따라 지속적으로 업데이트를 해줘야 한다.
만약 애플리케이션에 새로운 기능을 추가했거나 발견된 버그를 수정했다면, 이를 서비스에 반영하기 위해선 다시 배포해야 할 것이다.
즉, 수정 사항을 반영하기 위해 기존 프로세스를 재시작 해야 한다는 소리이다.