[ 살펴보기 ] PM2 - Configuration, Logs
![[ 살펴보기 ] PM2 - Configuration, Logs](https://cdn.hashnode.com/res/hashnode/image/upload/v1730737905902/575c5c45-35bc-405f-b024-9f25eb1d9c2a.jpeg)
PM2를 통해 application을 실행할 때 pm2 start app.js --watch와 같이 option을 command line에 전달해 실행할 수 있지만 pm2 configuration file을 생성해 실행하는 application의 pm2 option을 미리 설정하여 config 파일을 통해 실행할 수도 있다.
다음 command를 실행하면 현재 경로에 ecosystem.config.js라는 configuration file이 생성된다.
pm2 init simple
module.exports = {
apps : [
{
name : "apiServer",
script : "./app.js"
}
]
}
그리고 다음 command를 통해 configuration file기반으로 application을 실행할 수 있다.
pm2 start ecosystem.config.js
// config에 선언된 모든 app을 실행
start 외에 다른 기본 동작 역시 config 파일 기반으로 실행할 수 있다. 만약 기존 config file을 수정했다면 pm2 reload ecosystem.config.js나 pm2 restart ecosystem.config.js를 통해 변경사항을 적용해 주는 것을 잊지말자.
pm2 stop ecosystem.config.js
// config에 선언된 모든 app을 stop
pm2 restart ecosystem.config.js
// config에 선언된 모든 app을 restart
pm2 reload ecosystem.config.js
// config에 선언된 모든 app을 reload
pm2 delete ecosystem.config.js
// config에 선언된 모든 app을 delete
만약 config 파일에 선언된 app 중 특정 app에만 command를 적용하고 싶으면 다음과 같이 처리할 수 있다. 아래 예제에서 apiServer라는 이름은 위의 예제에서 config를 설정할 때 name property에 설정한 pm2 application name이다. 즉, 다음 restart command는 pm2가 실행 중인 application 중 name이 apiServer인 application에만 적용된다.
pm2 restart ecosystem.config.js --only apiServer
그리고 pm2을 통해 특정 entry point가 되는 file을 실행하는 것이 아닌 npm script를 통해 application을 실행해야 한다면 다음과 같이 config file을 구성할 수도 있다. 다음은 npm run startcommand를 통해 실행되는 application을 config 파일로 구성하는 예제다.
다음과 같이 config file을 구성하고 pm2 start ecosystem.config.js command를 통해 실행하면 application이 정상적으로 실행되는 것을 확인할 수 있다.
module.exports = {
apps: [
{
name: "clientApp",
script: "npm",
args: "run start",
cwd: "/home/.../client-app" // project path
},
],
};
Environment variable 설정
config 파일을 통해 environment variable을 설정할 수 있다.
module.exports = {
apps : [
{
name : "apiServer",
script : "./app.js",
env: {
"PORT": 3000
}
}
]
}
만약 production과 development 환경의 variables의 다르게 설정하고 싶다면 다음과 같이 설정하고 pm2을 실행할 때 --env command를 통해 사용할 environment variable을 설정할 수 있다.
module.exports = {
apps : [
{
name : "apiServer",
script : "./app.js",
env_production: {
"PORT": 3000
},
env_development: {
"PORT": 4000
}
}
]
}
만약 pm2을 실행할 때 pm2 start ecosystem.config.js --env production과 같이 env option을 production으로 전달하면 env_production에 설정한 environment variable이 사용되고 pm2 start ecosystem.config.js --env development와 같이 env option을 development로 전달하면 env_development에 설정한 environment variable이 사용된다.
Configuration options
Config 파일에 설정할 수 있는 option 중 일부는 다음과 같다. configuration의 모든 option은 documentation에서 찾아볼 수 있다. ( Reference - Configuration File )
name : application name을 설정한다.
module.exports = { apps : [ { name : "apiServer", ... } ] }script : pm2가 실행할 file 경로를 설정한다.
module.exports = { apps : [ { script : "./app.js", ... } ] }args : CLI를 통해 script를 실행할 때 전달할 arguments
module.exports = { apps : [ { args: "--option --mode=dev", ... } ] }instance : 실행 될 application instalce의 숫자.
module.exports = { apps : [ { instances: 1, ... } ] }exec_mode : application을 실행할 때 사용할 mode. fork 또는 cluster로 지정할 수 있다. default는 fork다.
module.exports = { apps : [ { exec_mode: "fork", ... } ] }watch : application을 실행할 때 watch mode로 실행할 것인지 여부 설정. watch mode로 실행하고 application의 파일에 업데이트가 발생하면 application이 reload된다.
module.exports = { apps : [ { watch: true, ... } ] }ignore_watch : watch mode를 실행할 때 watch mode에서 제외할 폴더나 파일을 설정한다.
module.exports = { apps : [ { ignore_watch: ["node_modules"], ... } ] }time : log를 기록할 때 log가 발생한 date정보를 함께 기록한다. default는 false다.
log_date_format : log와 함께 기록되는 date 정보의 format을 설정한다. 해당 property가 설정되어 있으면 time property는 따로 설정하지 않아도 된다.
module.exports = { apps : [ { log_date_format: "YYYY-MM-DD HH:mm:ss Z", ... } ] }error_file : error log file path를 설정한다. default 경로는
$HOME/.pm2/logs/<app name>-error-<pid>.log다.out_file : output log file path를 설정한다. default 경로는
$HOME/.pm2/logs/<app name>-out-<pid>.log다.restart_delay : application이 문제로 인해 종료되어 auto restart가 될 때 restart 간의 최소 deplay 시간을 설정한다. ms단위로 설정한다. default 값은 0이다.
module.exports = { apps : [ { restart_delay: 3000, ... } ] }autorestart : application이 문제로 인해 종료되었을 때 자동으로 restart할 것인지 설정한다. default는 true로 설정되어 있다.
module.exports = { apps : [ { autorestart: true, ... } ] }cron_restart : cron time을 설정해 application을 restart하고 싶을 때 사용할 수 있다.
module.exports = { apps : [ { cron_restart: "0 0 * * *", ... } ] }
Logs
pm2를 통해 application을 시작하면 application에서 출력하는 log는 default로 $HOME/.pm2/logs 폴더에 log 파일로 저장된다. 이때 error와 관련된 log는 <pm2로 실행한 app 이름>-error.log 파일에 기록되고 일반 log는 <pm2로 실행한 app이름>-out.log 파일에 기록된다.
특정 application log가 아닌 pm2 자체의 log는 default로 $HOME/.pm2/pm2.log 파일에서 관리된다.
pm2 logs command를 실행하면 pm2로 관리되고 있는 모든applicaton ( 실행 중이거나 중지 상태이거나 )과 pm2의 최근 log 15 lines를 확인할 수 있다.
만약 output log만 확인하고 싶다면 pm2 logs --out과 같이 --out option을 전달하고 error log만 확인하고 싶다면 pm2 logs --err와 같이 --err option을 전달한다.
또한 특정 application의 log만 출력하고 싶다면 application 이름을 pm2 logs command에 전달해 준다. 전달하는 application 이름은 pm2를 통해 app을 실행할 때 config file에 설정하거나 --name option을 통해 지정한 이름이다. pm2 list를 통해 application name을 확인할 수 있다.
pm2 logs clientApp
pm2 flush command를 통해 특정 application log파일을 비울 수 있다. 예를 들어 clientApp application의 log파일을 비우고 싶다면 다음 command를 실행한다.
pm2 flush clientApp
만약 pm2로 실행되는 특정 application의 log를 disable시키고 싶다면 pm2 config 파일에 다음과 같이 각 log의 path를 설정하는 property에 /dev/null이라고 설정한다.
module.exports = {
apps : [{
name: 'clientApp',
script: 'app.js',
out_file: "/dev/null", // disable output log
error_file: "/dev/null" // disable log disable
}]
}
그리고 설정한 config file을 통해 pm2를 실행하면 해당 application에서 발생하는 log은 더 이상 log file에 추가되지 않는다.
pm2 start ecosystem.config.js
![[ 살펴보기 ] RDB - Relationships](https://cdn.hashnode.com/res/hashnode/image/upload/v1739711556668/48dc9e84-a621-42aa-9c9f-5fc5c436f0ec.jpeg)
![[ 살펴보기 ] MySQL - Data types](https://cdn.hashnode.com/res/hashnode/image/upload/v1739593589113/530f8704-4d27-42c9-a451-bb5c63150b99.jpeg)
![[ 살펴보기 ] TypeORM - Transactions, Migration](https://cdn.hashnode.com/res/hashnode/image/upload/v1739106042581/980b8133-61d4-406a-a026-65be9c28eace.jpeg)
![[ 살펴보기 ] TypeORM - Relations](https://cdn.hashnode.com/res/hashnode/image/upload/v1738666874402/b688bd0b-b6bb-4f43-87d8-c1b46b59f1b7.jpeg)
![[ 살펴보기 ] TypeORM - Basics](https://cdn.hashnode.com/res/hashnode/image/upload/v1738666803591/bef5df17-7dc7-4123-ae55-004d5042df39.jpeg)