node.js & nginx

4. 배포 및 pm2 서비스 등록

프갭 2023. 5. 17. 16:22

1) Git 에서 소스 받기

배포할 소스를 Git에 Commit 후 Ubuntu에 설치된 git으로 소스를 내려 받는다

최초 소스를 clone 한다
git clone https://github.com/******/*****.git

package.json 패키지를 설치하기 위해
명령어 위치는 package.json이 있는 폴더에서 실행
npm install

2) Pm2으로  서비스 등록

npm run 명령어로 실행 할 경우  터미널을 닫으면 실행이 중단되기때문에
pm2로 서비스 등록하여 데몬화 하여 사용 한다.

pm2 설치
npm install -g pm2 

pm2 버전
pm2 --version

소스js 폴더로 이동

pm2 start index.js

3) 재배포

git root 폴더에서 소스를 내려 받는다.
git pull 

추가된 package가 있을경우 1) 번의 경우처럼 
npm install

pm2 리로드
pm2 reload index

4) watch

git으로 소스를 내려 받던가 직접 수정될경우 pm2 reload 하지 않아도 자동으로 반영 된다
pm2 reload index --watch

5) Cluster mode

node.js는 싱글 스레드이며 client요청이 call stack에 쌓여 queue로 처리하는 방식이다.

멀티코어 시스템에서도 단일 스레드만 사용하여 자원 활용 못하는 경우가 발생하는데
이럴경우 Cluster mode 를 사용하면 모든 코어를 활용 할수 있다.

Cluster mode는 Cluster module을 통해 작동 되고
요청을 Parent process가 받아 Child process에 재분배 된다.
Port는 서로 공유가 되고. child process는 각각의 V8에서 작동되어 Node 인스턴스를 각각 실행 하는 것과 같다.

#Cluster mode
#끝에 max는 코어 갯수만큼 생성되고 숫자를 입력하면 그입력수만큼 생성된다
pm2 start index.js -i max​

6) config.js 

위의 명령을 각각 실행하지 말고 config.js 파일을 만들어 실행하면 더쉽고 간편하게 실행 할 수 있다.
test.config.js 파일을 아래 설정으로 작성후 pm2 start test.config.js로 실행 하면된다.
module.exports = {
    apps: [
        {
            name: 'index_test', // pm2 name
            script: './src/index.js', // // 앱 실행 스크립트
            instances: 2, // 클러스터 모드 사용 시 생성할 인스턴스 수
            exec_mode: 'cluster', // fork, cluster 모드 중 선택
            merge_logs: true, // 클러스터 모드 사용 시 각 클러스터에서 생성되는 로그를 한 파일로 합쳐준다.
            autorestart: true, // 프로세스 실패 시 자동으로 재시작할지 선택
            watch: true, // 파일이 변경되었을 때 재시작 할지 선택
            // max_memory_restart: "512M", // 프로그램의 메모리 크기가 일정 크기 이상이 되면 재시작한다.
            env: {
                // 개발 환경설정
                NODE_ENV: 'development',
            },
            env_production: {
                // 운영 환경설정 (--env production 옵션으로 지정할 수 있다.)
                NODE_ENV: 'production',
            }
        },
        {
            name: 'index_test2', // pm2 name
            script: './src/index2.js', // // 앱 실행 스크립트
            instances: 1, // 클러스터 모드 사용 시 생성할 인스턴스 수
            exec_mode: 'fork', // fork, cluster 모드 중 선택
            merge_logs: true, // 클러스터 모드 사용 시 각 클러스터에서 생성되는 로그를 한 파일로 합쳐준다.
            autorestart: true, // 프로세스 실패 시 자동으로 재시작할지 선택
            watch: false, // 파일이 변경되었을 때 재시작 할지 선택
            // max_memory_restart: "512M", // 프로그램의 메모리 크기가 일정 크기 이상이 되면 재시작한다.
            env: {
                // 개발 환경설정
                NODE_ENV: 'development',
            },
            env_production: {
                // 운영 환경설정 (--env production 옵션으로 지정할 수 있다.)
                NODE_ENV: 'production',
            }
        }
    ]
};
pm2 start test.config.js

환경 변수 제어
작업을 하면서 개발환경과 배포환경을 두어서 편리하게 개발을 하기위해 pm2에서 NODE_ENV를 제어할수 있다

pm2 start test.config.js  //NODE_env: "development"

pm2 start test.config.js --env production //NODE_env: "production"



 

반응형