본문 바로가기
개발정리 (nodeJS)

[nodeJS] Node.js에서 forever로 프로세스 무중단 운영하기

by 할리갈리0 2025. 9. 1.

Node.js 애플리케이션을 운영하다 보면, 프로세스가 갑자기 종료되거나 에러로 중단되는 상황이 발생합니다.
이런 문제를 해결해 주는 도구 중 하나가 forever입니다.
forever는 Node.js 스크립트를 데몬처럼 백그라운드에서 돌려 주며, 프로세스가 죽으면 자동으로 재시작하고, 로그를 관리해 주는 간편한 도구입니다.

 

1. 설치 및 기본 개념

npm(또는 yarn)으로 전역 설치

# npm 기반 전역 설치
npm install -g forever

# yarn을 사용할 경우
# yarn global add forever

설치가 끝나면, CLI로 간단히 확인 가능

forever --version

 

[forever의 핵심 개념]

  • 스크립트 데몬화
  • 죽었을 때 자동 재시작
  • 로그 자동 기록

 

2. 쉘에서 forever로 시작하기

forever start -a -l forever.log -o out.log -e err.log app.js
  • -a: append 모드 (기존 로그에 덧붙이기)
  • -l: forever 자체 로그
  • -o: 표준 출력 로그
  • -e: 표준 에러 로그

이제 백그라운드에서 app.js가 실행되는지 확인하기

forever list

종료하려면

forever stop app.js

# 또는
forever stop <process-id>

 

 

3. 자동 재시작 & 재시작 조건 제어

forever는 애플리케이션이 에러나 process.exit() 호출로 중단될 때 자동으로 재시작
하지만 상황에 따라 재시작 조건을 세밀하게 제어하고 싶을 때는 아래 옵션을 사용

forever start \ 
--minUptime 10000 \ 
--spinSleepTime 5000 \ 
-a -l forever.log \ 
-o out.log -e err.log \ 
app.js
  • --minUptime 10000: 최소 10초간 살아 있으면 정상 실행으로 인식
  • --spinSleepTime 5000: 재시작 전 5초 대기

짧은 시간에 자꾸 죽는다면, 재시작 시도를 일정 시간 쉬게 만드는 전략으로 사용

 

 

4. 로그 로테이션 연동하기 (logrotate)

forever 자체에는 로그 롤링 기능이 없어서, 흔히 logrotate를 함께 사용

[/etc/logrotate.d/myapp 파일]

/var/log/myapp/forever.log /var/log/myapp/out.log /var/log/myapp/err.log {
  daily
  missingok
  rotate 7
  compress
  delaycompress
  notifempty
  copytruncate
}
  • daily: 하루마다 회전
  • rotate 7: 7일치 보관
  • compress, delaycompress: 압축
  • copytruncate: 로그 파일 복사 후 잘라내기 → forever 재시작 없이 안전하게 롤링
sudo logrotate -f /etc/logrotate.d/myapp

이후에는 cron.daily에 의해 자동으로 실행

 

 

5. 실제 app.js 예시와 테스트 코드

2초마다 heartbeat를 출력하고, 5회 후에는 일부러 crash를 유발하는 스크립트 작성

// app.js
let count = 0;
process.on('SIGTERM', () => {
  console.log('Received SIGTERM, exiting...');
  process.exit(0);
});

setInterval(() => {
  count++;
  console.log(`Heartbeat #${count} – ${new Date().toISOString()}`);
  if (count >= 5) {
    console.log('Simulating crash...');
    throw new Error('Crash!');
  }
}, 2000);
 

 

forever start -a -l forever.log -o out.log -e err.log app.js

[정상 동작 시]

  • out.log → heartbeat 출력
  • err.log → crash 메시지와 stack trace
  • forever.log → 재시작 내역
  • crash 후에도 forever list에서 살아 있는 프로세스 확인 가능

 

6. 프로세스 종료 방법

forever list로 현재 실행 중인 항목을 확인한 뒤 종료

# 스크립트 이름으로 종료
forever stop app.js

# index 번호로 종료
forever stop 0

# 모든 프로세스 종료
forever stopall

 

 

 

 

7. 윈도우 환경에서 주의할 점

  • forever는 원래 리눅스/유닉스 환경에 최적화되어 있지만 윈도우에서도 동작 가능
  • 단, 경로에 한글/공백이 있으면 실행 오류가 날 수 있으니 단순한 경로 권장
  • 로그 회전은 logrotate 대신 윈도우 태스크 스케줄러 + PowerShell 스크립트 활용 필요

 

 

8. forever vs PM2 비교

기능 forever PM2
설치/사용 매우 단순 비교적 복잡
자동 재시작 지원 지원
클러스터 모드 미지원 지원 (-i max)
대시보드 없음 pm2 monit, pm2 dashboard
로그 관리 외부 logrotate 필요 자체 회전 기능 지원
유지보수 업데이트 드묾 활발히 유지보수 중
  • 가벼운 프로젝트 → forever
  • 규모가 크거나 모니터링 필요 → PM2

 

 

9. 자주 쓰는 forever 명령어

 
# 실행
forever start app.js

# 현재 실행 중인 프로세스 확인
forever list

# 로그 확인
forever logs 0
forever logs 0 -f

# 재시작
forever restart app.js
forever restartall

 

 

 

forever는 단순하지만 강력한 Node.js 무중단 운영 도구입니다.

  • 설치 후 바로 쓸 수 있는 쉬운 CLI
  • 자동 재시작, 재시작 조건 제어
  • 로그 관리(logrotate와 조합)

더 복잡한 요구가 있다면 PM2 같은 대안도 있지만, 가볍고 기본에 충실한 환경이라면 forever만으로도 충분히 안정적인 운영이 가능합니다.

반응형