만족
[Nodejs] pm2로 nodejs 데몬 프로세스 관리하기 본문
[Nodejs] pm2로 nodejs 데몬 프로세스 관리하기
Nodejs Satisfaction 2023. 3. 13. 00:53여러가지 nodejs 데몬 툴 중 forever와 pm2가 특히 유명한데,
forever는 기능은 적지만 사용법이 매우 간단해 운영중인 nodejs 서비스에 사용 중이었다.
그러나 모니터링, 무중단 업데이트와 같은 다양한 기능들이 필요하게 되었고,
따라서 forever에서 pm2로 이주해보려 한다.
PM2 - Home
Advanced process manager for production Node.js applications. Load balancer, logs facility, startup script, micro service management, at a glance.
pm2.keymetrics.io
PM2
Nodejs 데몬 프로세스 매니저다.
단순히 노드를 데몬 프로세스로 만들고 관리하는 것에 그치지 않고,
무중단 서비스를 제공하거나 클러스터링, 원격 관리, 모니터링 등 관리에 필요한 유틸들을 함께 제공해 준다.
많은 피쳐를 가지고 있음에도 사용법 자체는 복잡하지 않아 사용을 추천한다.
forever를 사용하면서 가장 불만이었던 것이 재배포를 할 때(코드 변경 후 다시 배포)
잠깐동안 서비스가 사용 불가능한 상태가 되는 것이었다.
그러나 pm2에서는 여러 개의 인스턴스를 띄워 놨을 때(클러스터 모드)
프로세스를 한 개씩 교체함으로써 서비스가 중단되는 일 없이 업데이트가 가능하다.
pm2 monit 명령을 이용해 프로세스/앱별 상태를 확인할 수 있다.
pm2 monitor 명령을 이용하면 웹에서 모니터링을 할 수도 있고,
심지어는 문제가 생겼을 때 프로세스를 재시작할 수도 있다.
기존에는 앱 원격 모니터링을 위해 express-status-monitor 모듈을 붙여 사용중이었는데,
pm2를 사용한다면 굳이 그럴 필요가 없다.
PM2: Quick Start
https://pm2.keymetrics.io/docs/usage/quick-start/
PM2 - Quick Start
Advanced process manager for production Node.js applications. Load balancer, logs facility, startup script, micro service management, at a glance.
pm2.keymetrics.io
npm install pm2@latest -g
pm2를 글로벌로 설치한다
//ecosystem.config.js
module.exports = {
apps: [
{
name: "cyphers-supporter-proxy",
script: "app.js",
watch: false,
instances: 1,
env: {
NODE_ENV: "production",
},
min_uptime: 5000,
max_restarts: 5,
restart_delay: 1000,
},
],
};
ecosystem.config.js 를 생성한다.
//app.js
const express = require('express')
const app = express()
const port = 3000;
//...
app.listen(port, function () {
console.log(`> localhost:${port} is listening...`)
})
express-generator를 이용해 express 프로젝트를 생성했다면,
포트 지정은 bin/www에서 담당한다.
이제 app.js를 데몬화시킬 것이므로, app.js에 app.listen(port, ....) 부분을 추가한다.
(이미 추가되어있다면 스킵)
# echosystem.config.js에서 지정한 설정으로 앱 시작
pm2 start echosystem.config.js
# 지정한 앱 재시작
pm2 restart app_name
# 지정한 앱 다시 로드 (cluster 모드에서 사용할 경우, 한 개의 프로세스는 유지하면서 재시작함; 무중단)
pm2 reload app_name
# 지정한 앱 stop 상태로 변경 (restart로 다시 시작 가능; 모든 프로세스를 kill하고 재실행)
pm2 stop app_name
# 지정한 앱 삭제 (다시 시작하려면 pm2 start [...] 사용)
# echosystem.config.js 에서 설정값을 변경했다면 삭제 후 다시 실행
pm2 delete app_name
이제 지정한 설정값에 따라 앱을 관리할 수 있다.
이 설정값은 fork mode로 동작한다.
(무중단 배포 지원 안함)
PM2: Continuous deploy
무중단 배포를 사용하기 위해서는 fork mode 가 아닌 cluster mode를 사용해야 한다
여러 개의 프로세스를 띄워 놓고, 하나씩 변경하는 방법을 사용한다.
module.exports = {
apps: [
{
name: "cyphers-supporter-proxy",
script: "app.js",
watch: false,
//0일 경우 CPU 갯수만큼 인스턴스 생성 (cluster mode)
instances: 0,
env: {
NODE_ENV: "production",
},
min_uptime: 5000,
max_restarts: 5,
restart_delay: 1000,
//새로운 프로세스로부터 ready 메시지를 받았을 때 해당 프로세스 사용
wait_ready: true,
},
],
};
instance값을 변경하고, wait_ready 값을 true로 설정한다.
(app.js를 실행한 직후 별도 작업 없이 앱 사용이 가능하다면 wait_ready는 필요없다)
//app.js
const express = require('express')
const app = express()
const port = 3000;
//...
app.listen(port, function () {
console.log(`> localhost:${port} is listening...`)
})
//db 커넥션 체크와 같은 작업이 완료된 후 ready 메시지를 보낸다
your_prepare_job()
.then(()=> {
// process.send는 app.js가 child process일 때만 활성화된다
// 따라서 개발 모드 또는 fork mode를 동시 실행한다면 if로 검사한 후 실행한다
if(process.send)
process.send('ready');
})
.catch(e=> {
console.error(e);
//오류 발생
process.exit(-1);
});
app.js에서도 앱이 사용 가능한 상태가 되면 process.send('ready'); 를 실행하여 프로세스를 교체한다.
아래 글에서 pm2를 이용해 무중단 서비스를 구현하는 내용을 자세히 알아볼 수 있다.
https://engineering.linecorp.com/ko/blog/pm2-nodejs/
PM2를 활용한 Node.js 무중단 서비스하기
이 글은 마이크로소프트웨어 393호에 기고된 글입니다. 자바스크립트는 가장 널리 사용되는 클라이언트 측 프로그래밍 언어이자 프론트엔드 웹 개발 언어 중 하나입니다. 그리고 Node.js는 Chrome의
engineering.linecorp.com
PM2: Set startup script
시스템 시작 후 자동으로 앱을 시작하게 할 수도 있다.
pm2 startup
이 스크립트를 입력하고 나면, 스타트업 스크립트를 자동으로 구성해 준다.
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/local/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu --hp /home/ubuntu
아래와 같이 나타나면 sudo env ~~ 부분을 복사해 다시 입력한다.
sudo env PATH=$PATH:/usr/local/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu --hp /home/ubuntu
실행이 끝나면 pm2 save 를 입력해 저장한다
pm2 save
스타트업 스크립트를 제거하려면 pm2 unstartup을 입력한다.
pm2 save를 입력한 시점에서 현재 pm2가 실행하고 있는 프로세스 리스트가 저장되므로,
수정/삭제/추가가 이루어졌을 경우 pm2 unstartup을 실행한 후, pm2 startup 부터 다시 실행하여 세팅하면 된다.
https://pm2.keymetrics.io/docs/usage/startup/
PM2 - Startup Script
Advanced process manager for production Node.js applications. Load balancer, logs facility, startup script, micro service management, at a glance.
pm2.keymetrics.io
'Nodejs' 카테고리의 다른 글
[Nodejs] file의 birthtime과 mtime (0) | 2024.10.11 |
---|---|
[Nodejs] 더 작고 빠른 패키지 매니징을 위한 yarn berry (0) | 2023.08.12 |
[Nodejs] 커맨드 동시 실행으로 커밋 검사 속도 향상 (0) | 2023.01.22 |
[Nodejs] husky 를 이용한 Githook 추가 (0) | 2022.05.23 |
[Nodejs] jest를 이용한 테스트 코드 작성 (0) | 2022.05.23 |