express를 사용해 서버를 돌릴때 나는 nodemon을 자주 이용했었다.
하지만 pm2라는 것을 알고 난 뒤 이것만 쓰게 되었다!!
그렇다면 pm2는 뭘까?
Process Manager의 약어로 Node.js의 프로세스를 관리해주는 역할을 하는 녀석이다.
쉽게 말해 프로세스들이 계속 실행될 수 있는 환경을 제공해준다!!
또한 예외가 발생해 스레드가 죽었을때 어플리케이션도 같이 죽는 것을 방지해준다.
프로세스 매니저라는 이름에 맞게 관리자의 역할을 톡톡히 한다.
지금부터 pm2를 이용해 로컬에서 ncloud로 배포하는 과정을 설명할 것이다.
https://pm2.keymetrics.io/docs/usage/deployment/
PM2 - Deployment
Advanced process manager for production Node.js applications. Load balancer, logs facility, startup script, micro service management, at a glance.
pm2.keymetrics.io
pm2의 공식 문서를 참고해 배포를 진행 할 것이다.
먼저 ecosystem.config.js 파일을 만들어주자 (pm2.config.js파일은 시도한 결과 오류가 발생한다.)
아래와 같이 파일 내용을 채워 넣어준다.
module.exports = {
apps: [
{
script: 'websocket.js',
},
{
script: 'server.js',
},
],
// Deployment Configuration
deploy: {
production: {
user: 'fansor',
host: ['0.0.0.0'],
ref: 'origin/dev',
repo: 'git@github.com:깃허브 repo',
path: '/fansor-project/',
'post-setup': 'npm install -g yarn',
'post-deploy': 'yarn install && yarn build && yarn production',
},
},
};
apps부분에 해당하는 것들은 pm2에서 실행할 프로세스들을 말한다.
따라서 현재 websocket.js와 server.js를 실행하려고 하는 중인 것이다.
이제 스크립트 부분을 봐야하는데 deploy내부의 production은 pm2 deploy production 명령에 해당하는 부분이다.
production내부를 자세히 살펴보면
user는 배포할 서버의 user를 말하고, host는 배포 서버의 IP주소, ref는 배포할 깃허브 브랜치, repo는 배포할 깃허브 repo, path는 clone받아올 배포 서버의 경로를 의미한다.
pm2 배포는 설정한 Github의 repo를 clone 받아와 설정한 명령들을 수행해 배포를 진행하는 것이다.
따라서 맨 처음 한번은 배포 서버에 접속해 pm2를 설치 해줘야 한다.
또한
$ pm2 deploy production setup
명령을 통해 배포전 setup을 해줘야한다.
배포명령을 수행하기 전에 production의 나머지 설명을 추가하겠습니다!!
"pre-setup" : "echo 'commands or local script path to be run on the host before the setup process starts'",
"post-setup": "echo 'commands or a script path to be run on the host after cloning the repo'",
"pre-deploy" : "pm2 startOrRestart ecosystem.json --env production",
"post-deploy" : "pm2 startOrRestart ecosystem.json --env production",
"pre-deploy-local" : "echo 'This is a local executed command'"
공식 문서에 보면 이렇게 다양한 옵션들이 있는 것을 확인 할 수 있다.
위에서 부터 차례대로 setup전에 수행할 명령, setup 후에 수행, 배포전, 배포후, 그리고 배포전 로컬(내컴퓨터)에서 수행할 명령이 있다.
위 옵션들을 적절하게 활용하면 로컬에서 배포를 진행 할 수 있게 된다.
'post-setup': 'npm install -g yarn',
'post-deploy': 'yarn install && yarn build && yarn production',
나의 프로젝트에서 설정한 옵션들을 보면 setup전, 배포 후 명령에 대해 설정해두었다.
먼저 setup전에는 npm의 상위버전이라고 불리는 yarn을 설치하였다(yarn을 이용해 이후 명령을 수행할 것이기 떄문이다.)
배포 후의 명령을 보면 yarn install을 통해 dependencies를 설치 해준다.
또 && 명령을 통해 앞의 명령이 성공적으로 수행되었을때 뒤의 명령을 실행시켜준다.(반대는 || : 실패 했을 경우)
yarn build를 해주는 이유는 프론트에서 번들링 한 파일을 express에서 정적 파일로 설정한 다음 그 파일을 실행시켜줄 것이기 때문이다.
아래는 현재 프로젝트의 구조이다.
yarn build를 통해 build폴더에 번들링 한 다음 express로(server.js)로 번들링된 파일을 실행해주는 방식이다.
따라서 yarn build를 실행한 다음 yarn production을 실행한다.
"scripts": {
"production": "pm2 startOrRestart ecosystem.config.cjs",
"deploy": "pm2 deploy production"
},
다음은 package.json의 스크립트 일부이다.
yarn production을 실행하면 pm2 startOrRestart ecosystem.config.cjs가 실행되고 apps로 설정한 파일 두개가 돌아가게 된다.
이제
$ pm2 deploy production
를 로컬에서 실행하면?
안될 것이다.
깃허브 clone에서 문제가 생길 것이다.
(로컬과 배포서버와는 id_rsa.pub 공개키로 비밀번호 없이 연결하도록 설정했다고 가정한다.)
이때는 로컬과 배포서버를 공개키로 연결한 것과 동일하게 배포서버와 깃허브를 연결해줘야한다!!
연결을 완료하게 되면
아래와 같이 배포가 완료될 것이다
끝!
'웹 프로그래밍 > BackEnd' 카테고리의 다른 글
[SQL] 쿼리 튜닝이란?(+기본 개념) (0) | 2022.11.25 |
---|---|
[Docker] Docker란? (0) | 2021.11.11 |
[Express, nodejs] SPA에서 socket.io로 채팅 구현하기 (2) | 2021.10.13 |
[네트워크] Websocket과 socket.io (0) | 2021.10.06 |
[Backend] OAuth란?(+ 동작방법) (3) | 2021.09.30 |