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만으로도 충분히 안정적인 운영이 가능합니다.
반응형
'개발정리 (nodeJS)' 카테고리의 다른 글
| [nodeJS] Node.js에서 엑셀 읽기: xlsx vs exceljs 비교와 안정적인 파싱 패턴 (0) | 2025.09.03 |
|---|---|
| [nodeJS] Node.js 클러스터 모드로 멀티코어 100% 활용하기: cluster 기본기와 실무 패턴 (0) | 2025.09.02 |
| [nodeJS] Node.js에서 생명 주기 활용하기 (0) | 2025.01.31 |
| [nodeJS] Node.js에서 이벤트 기반 아키텍처 구현하기 (0) | 2025.01.24 |
| [nodeJS] Node.js에서 DB 프로시저 활용하기 (0) | 2024.12.31 |