일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 연결리스트
- 이진탐색
- 데코레이터
- 다대다
- 일대다
- 스토어드 프로시저
- 연관관계
- FetchType
- dfs
- 스프링 폼
- JPQL
- 동적sql
- 힙
- 낙관적락
- 백트래킹
- 유니크제약조건
- querydsl
- execute
- eager
- PS
- 다대일
- 즉시로딩
- 비관적락
- exclusive lock
- fetch
- BOJ
- SQL프로그래밍
- shared lock
- 지연로딩
- CHECK OPTION
- Today
- Total
흰 스타렉스에서 내가 내리지
서버가 꺼졌을 때 자동으로 다시 켜주는 pm2 패키지 본문
pm2는 원활한 서버 운영을 위한 패키지이다.
'개발할 때 nodemon을 쓴다면, 배포할 때는 pm2를 쓴다.
가장 큰 기능은 서버가 에러로 인해 꺼졌을 때 서버를 다시 켜주는 것이다.
또 하나의 중요한 기능은 바로 멀티 프로세싱이다.
멀티 스레딩은 아니지만 멀티 프로세싱을 지원하여 노드 프로세스 개수를 한 개 이상으로 늘릴 수 있다.
기본적으로 CPU 코어를 하나만 사용하는데, pm2를 사용해서 프로세스를 여러 개 만들면 다른 코어들까지 사용할 수 있다.
클라이언트로부터 요청이 올 때 알아서 요청을 여러 노드 프로세스에 고르게 분배한다.
하나의 프로세스가 받는 부하가 적어지므로 서비스를 더 원활하게 운영할 수 있다.
단점도 있다.
멀티 스레딩이 아니므로 서버의 메모리 같은 자원을 공유하지는 못한다.
지금까지 세션을 메모리에 저장했는데, 메모리를 공유하지 못해서 프로세스 간에 세션이 공유되지 않게 된다.
로그인 후 새로고침을 반복할 때 세션 메모리가 있는 프로세스로 요청이 가면 로그인된 상태가 되고, 세션 메모리가 없는 프로세스로 요청이 가면 로그인되지 안은 상태가 되는 것이다.
이 문제를 극복하기 위해서는 세션을 공유할 수 있게 해주는 무언가가 필요하다.
이를 위해 주로 멤캐시드나 레디스 같은 서비스를 이용한다.
npm i pm2
// package.json
"scripts": {
"test": "jest",
"start": "cross-env NODE_ENV=production PORT=80 pm2 start server.js",
"dev": "nodemon server",
"coverage": "jest --coverage"
},
리눅스나 맥에서 pm2 실행 시
리눅스나 맥에서 pm2를 실행할 때 1024번 이하의 포트를 사용하려면 관리자 권한이 필요하다. 따라서 sudo를 명령어 앞에 붙여 실행한다. 앞으로 나오는 다른 명령어도 sudo npm start, sudoo npx pm2 list, sudo npx pm2 kill, sudo npx pm2 monit 처럼 하면 된다
pm2는 노드 프로세스를 백그라운드로 돌린다.
백그라운드에서 돌고 있는 노드 프로세스를 확인할 방법이 필요한데, npx pm2 list 명령어를 사용하면 된다.
npx pm2 list
npm start를 실행했을 때처럼 현재 프로세스 정보가 표시됩니다.
프로세스 아이디(pid), CPU와 메모리 사용량 (mem) 등이 보여 편리하다.
uptime과 status 사이에 재시작된 횟수가 나오는데, 0이 아니라면 서버가 재부팅된 적이 있다는 것을 의미한다.
이 경우에는 왜 재시작 되었는지 확인해봐야 한다.
npx pm2 logs로 로그를 확인할 수 있다.
에러 로그만 보고 싶다면 뒤에 -err을 붙이고, 출력 줄 수를 바꾸고 싶다면 --lines 숫자 옵션을 사용한다.
나중에 pm2 프로세스를 종료하고 싶다면 콘솔에 npx pm2 kill을 입력하면 된다.
서버를 재시작하고 싶다면 npx pm2 reload all을 입력한다.
다운타임(서버가 중지되어 클라이언트가 접속할 수 없는 시간)이 거의 없이 서버가 재시작되어 좋다.
노드의 cluster 모듈처럼 클러스터링을 가능하게 하는 pm2의 클러스터링 모드를 사용해보자.
// package.json
"scripts": {
"test": "jest",
"start": "cross-env NODE_ENV=production PORT=80 pm2 start server.js -i 0",
"dev": "nodemon server",
"coverage": "jest --coverage"
},
pm2 start app.js 대신에 pm2 start app.js -i 0 명령어를 사용한다.
취향에 따라 pm2 start app.js -i -1도 많이 사용한다.
-i 뒤에 생성하길 원하는 프로세스 개수를 기입하면 된다.
0은 현재 CPU 코어 개수만큼 프로새스를 생성한다는 뜻이고, -1은 프로세스를 CPU 코어 개수보다 한 개 덜 생성하겠다는 뜻이다.
남은 코어 하나는 노드 외의 다른 작업을 할 수 있게 하기 위해서 이다. 예제에서는 -i 0 을 사용한다.
npx pm2 kill 로 서버를 종료한 뒤 변경된 명령어를 사용해 보자. &&를 사용해 여러 개의 명령어를 연달아 실행할 수 있다.
npx pm2 kill && npm start
예제를 작성한 컴퓨터는 코어가 여섯 개이므로 프로세스가 여섯 개 생성되었다.
또한, mode가 cluster로 되어 있어 클러스터링 중임을 알 수 있다.
현재 프로세스를 모니터링할 수도 있다.
npm pm2 monit
실제 서버 운영 시, 서비스 규모가 커질수록 비용이 발생할 가능성이 커지므로 놀고 있는 코어까지 클러스터링으로 작동하게 하는 것이 비용을 절약하는 길이다.
하지만 프로세스 간에 메모리를 공유하지 못하는 문제도 있으므로 최대한 프로세스 간에 공유하는 것 (세션 등)이 없도록 설계해야 한다.
공유해야 하는 데이터가 있다면 데이터베이스를 사용해야 한다.
'Node.js' 카테고리의 다른 글
쿠키와 세션 사용해보기 (0) | 2022.06.28 |
---|---|
로그를 남겨주는 winston 패키지 (0) | 2022.06.13 |
배포 (0) | 2022.06.12 |
nodeJS 프로젝트 준비 (0) | 2022.06.12 |
미들웨어 속의 미들웨어?? (0) | 2022.05.28 |