반응형

pm2란?
pm2는 Node.js 애플리케이션을 관리하기 위한 프로세스 매니저로 애플리케이션을 백그라운드에서 실행하고, 자동으로 재시작하며, 여러 가지 기능을 제공한다.

설치와 실행
npm install pm2 -g를 실행하면 설치가 가능하다.
반드시 -g로 전역설치를 해야만 한다.
안그러면 command not found오류를 만나게 될 것이야~

기본 실행방법은 아래와 같다.
(참고로 내 node.js 푸시 서버 이름은 pushServer.js다.)

시작
pm2 start pushServer.js

중지
pm2 stop pushServer.js

만약 실행중인 프로그램을 또 실행하려 들면 기특하게도 이런 오류를 내뱉어준다.

pm2를 사용하는 이유는 로그아웃을 해도 pm2로 돌리면 나중에 관리가 되기 때문이다.



자동 재실행
여기가진 좋다.
그.런.데 
내가 만든 푸시 서버 node.js는 node-cron을 사용하여 1분마다 체크 로직이 들어있는데 이상한게 계속 메모리 점유율이 올라갔다. 59M .. 60M .. 71M ...
의심가는 로직을 주석처리 해보고 별짓 다 해봐도 아무리 용을 써도 메모리 점유율이 그대로였다.
node-cron만 사용하면 그랬다.
혹시나 싶어 pm2 대신 그냥 node pushServer.js로 실행한들 동일했다.

그러다 pm2는 자동 재실행하거나 메모리 사이즈가 일정 수치를 넘어서면 자동 재실행 등 다양한 옵션질이 가능하니 이를 활용하기로 했다.

일단 메모리 오버시 자동 재실행을 하기 위해선 별도의 js를 만들어야 한다.
이름은 process.config.js라 지었다.

module.exports = {
    apps: [{
      script: "pushServer.js",
      instances: "max",
      exec_mode: "cluster",
      max_memory_restart: '100M' // 프로세스의 메모리가 100MB에 도달하면 reload 실행
    }]
  };

이 process.config.js를 저장하고 실행을 시킨다.
pm2 start process.config.js   (종료는 pm2 stop process.config.js)

이 경우 인스턴스가 max로 되어 있는데
내 경우 새벽 3시마다 재실행을 하고 싶고 1개의 인스턴스만 실행되어야 하므로 내용을 이렇게 바꿔줬다.
max대신 1, cluster대신 fork

module.exports = {
    apps: [{
      name: "pushServer",
      script: "/node/push/pushServer.js",
      instances: 1,
      exec_mode: "fork",
      cron_restart: '0 3 * * *',
      log: "/node/push/log/pushServer.log",
    }],
}

이후 pm2 start process.config.js를 실행하면 알아서 잘 동작한다.
해당 파일안의 script를 원하는 인스턴스의 개수 만큼 실행해주고 로그 또한 원하는 위치에 만들어준다.

혹시라도 실수로 instances를 이미 max로 실행해서 프로세스가 여러개 생성되었다면 pm2 list를 실행해보고 
pm2 delete all 명령어로 깨끗하게 다 지워버리면 된다.
성형 후 다시 새롭게 시작할 수 있다.

모니터링
실행중인 node.js 프로그램의 상태를 확인하고 싶다면 monit 기능을 이용하면 된다.
pm2 monit
좌측 상단엔 실행중인 프로세스 리스트로 화살표로 이동이 가능하다.
우측 하단에 Metadata에서 앱 이름과 버전 재실행 횟수 실행기간 등등 정보와 
좌측 하단엔 메모리 정보들을 확인 가능하다.

모니터 툴을 빠져나올 땐 ctrl+c로 빠져나오면 된다.
하단에 기본적인 사용 안내가 나와있는것을 확인할 수 있다.

로그파일
pm2로 실행중인 node.js 프로그램에서 console.log를 찍으면 로그가 .pm2/logs 폴더에 파일로 계속 쌓이는데 이것도 로그 파일 사이즈별로 컨트롤이 가능하다.
이거 안해주면 나중에 어마어마한 사이즈의 로그파일을 경험하게 되니 반드시 해주자.

방법은 특이하게 npm i가 아닌 pm2 install pm2-logrotate 이렇게 설치해야 한다.
당연히 pm2는 제일 위에 언급하였듯이 npm으로 설치를 미리 해두어야 한다.


pm2 set pm2-logrotate:max_size 1K 또는 pm2 set pm2-logrotate:max_size 1M 이런식으로 실행 후 pm2 start pushServer.js를 실행하면 이후 console.log로 찍은 로그는 저 사이즈를 넘을 경우 자동으로 새로운 파일이 생성된다.

만약 이것도 싫고 하루마다 파일을 생성하고 싶다면?
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'




끝으로 자동재실행까진 괜찮은데 이 경우 메모리 누수가 발생하는건 아닌가 불안하다.
여기까진 확인을 못해봤다.

반응형
Posted by Hippalus
,

반응형

Node.js로 FCM 푸시 서버를 만들어 항상 백그라운드에서 동작하도록 하려면 여러 가지 방법이 있다. 
가장 일반적인 방법은 forever나 pm2와 같은 프로세스 관리 도구를 사용하는 것으로 이러한 도구를 사용하면 서버가 비정상적으로 종료되더라도 자동으로 다시 시작되도록 설정할 수 있다.

일단 pm2를 전역으로 설치한다.
이때 반드시 su 계정으로 로그인하여야 한다.
다시 일반 계정으로 복귀하고자 한다면 su - 일반계정이름 엔터를 치면 된다.

npm install -g pm2
그런 다음, Node.js 애플리케이션을 pm2로 실행할 수 있다.

bash
Copy code
pm2 start your_fcm_server.js
이제 your_fcm_server.js는 백그라운드에서 계속 실행된다.

만약 서버를 중지하려면 다음 명령어를 사용한다.
pm2 stop your_fcm_server.js

또는 모든 프로세스를 중지하려면
pm2 stop all

더 나은 안정성을 위해, 서버가 리부팅될 때 자동으로 시작되도록 만들 수 있다.
이를 위해서는 다음 명령어를 실행한다.

pm2 startup
이 명령어를 실행하면 pm2가 서버 리부팅 시에도 자동으로 시작되도록 설정된다.
이렇게 하면 Node.js 애플리케이션이 항상 백그라운드에서 실행되도록 할 수 있다.

기본적으로 pm2는 로그와 관련된 다양한 기능을 제공하므로, 서버의 상태를 모니터링하고 문제를 디버깅하는 데 도움이 된다.
pm2 logs

특정 프로세스의 로그만 확인하려면 프로세스 이름 또는 ID를 지정할 수 있다.

pm2 logs your_fcm_server

로고 출력 설정:
pm2에서는 로그의 출력을 여러 가지 형식으로 설정할 수 있다.
예를 들어, JSON 형식으로 출력하려면 다음과 같이 명령어를 사용한다.

pm2 logs --json

로그 위치 확인
pm2는 각 프로세스의 로그를 파일로 저장한다. 
로그 파일은 기본적으로 ~/.pm2/logs/ 디렉토리에 저장되며, 특정 프로세스의 로그 파일 위치를 확인하려면 다음과 같이 명령어를 사용한다.

pm2 show your_fcm_server
이 명령어는 프로세스의 상세 정보를 보여주는데, 그 중에서 "log_path" 항목이 로그 파일의 경로를 나타낸다.

로그 파일을 삭제하려면 pm2 flush 명령어를 사용한다.
pm2 flush

실시간 로그 모니터링 중지인 
pm2 logs 명령은 실시간 로그 모니터링을 위한 것이기 때문에 Ctrl+C를 누르면 모니터링이 중지된다.

반응형
Posted by Hippalus
,