[Node.js] PM2와 무중단 배포
예전에는 서버를 점검하고 수정할 때 서버를 죽였다가 재실행해서 변경사항을 적용하고 했다.
이런건 당연히... 치명적인 서비스상의 결함이다.
다행히도 node에선 pm2라는 프로세스 매니저 툴을 통해서 이러한 문제를 해결할 수 있다.
node는 기본적으로 싱글 스레드로만 동작하는데, pm2을 사용하면 node에서 여러개의 코어를 사용하게 할 수 있다. 또 이를 잘 응용하면 스위칭을 통해 중단 없이 재실행되게 할 수도 있다.
먼저 설치를 해보자.

그리고 start 명령어로 node 소스파일을 실행하면
이렇게 뜨면서 해당 프로그램이 백그라운드에서 돈다!
상태 확인
돌아가는 상태를 확인하고 싶다면 status 명령을 사용하면 되고

프로세스 삭제
돌아가고 있는 프로세스를 죽이고 싶다면 delete 명령어에 프로세스 id를 찍어주면 된다.

kill로 다 죽일 수도 있다.

클러스터 모드
근데 저렇게 실행만 해서는 별 의미가 없다.
그럼 fork모드로만 실행이 되는데, 그대로 싱글스레드로만 동작하기 때문이다.
코어들을 최대한 활용하기 위해서는 클러스터 모드로 실행해야 하는데, 그러면 전용 설정파일을 추가해야 한다.
이름은 무조건 ecosystem.config.js여야 한다.
그리고 대강 다음과 같이 작성해주면 된다.
pm2로 원래 소스파일이 아니라, 이 설정파일을 실행시키고, 이 설정파일에서 script로 원래 소스파일을 넣어주는 것이다.
이 상태로 다시 config 파일을 실행시키면
이제 제대로 동작한다!
프로세스 추가
나는 욕심이 많아서 프로세스를 더 뽑게 하고 싶다! 하면 scale 명령어를 사용하면 된다.
이렇게 하면 myapp에 프로세스를 2개 추가할 수 있다.

프로세스 재실행(비권장)
만약 소스를 수정한 후, 프로세스를 재실행하게 하고 싶다면 restart 명령을 쓰면 된다.
간단하다.

프로세스 리로드(권장)
근데 저건 무식하게 죽이고 다시 실행을 하기 때문에, 별로 좋지 않다.
reload는 kill 없이 바로 올린다! 프로세스가 죽지 않는다는 말이다.

간단한 상황에서는 reload을 사용하는 것만으로도 무중단 배포가 일단은 가능하다.
더 복잡한 상황에 대해서는 이후 포스트에서 정리해보겠다.
참조
https://engineering.linecorp.com/ko/blog/pm2-nodejs/
https://blog.rhostem.com/posts/2018-05-27-pm2-deploy
https://pm2.keymetrics.io/docs/usage/cluster-mode/#reload