📚 2년차 프론트엔드 개발자의 12주 기초 챌린지
Week 2: 배포 환경 이해하기 (Day 6-10)
Day 7에서 SSH로 서버에 접속해서 yarn start를 실행하면 사이트가 켜진다는 걸 배웠다.
그런데 전화(SSH)를 끊으면 셰프가 불을 끄고 퇴근해버린다.
레스토랑이라면 주방 매니저가 있어서:
이 주방 매니저가 바로 pm2다!
프로세스 = 실행 중인 프로그램
서버에서 yarn start를 하면 Node.js 프로세스가 하나 생긴다.
레스토랑 비유:
💡 "프로세스가 죽는다" = 개발자 관점 (셰프가 쓰러졌다)
💡 "사이트가 죽는다" = 사용자 관점 (음식이 안 나온다)
→ 같은 현상을 다른 관점에서 보는 것!
크래시 = 프로그램이 예상 못한 에러를 만나서 스스로 멈춰버리는 것
셰프가 요리하다가 갑자기 쓰러지는 것. 계획된 퇴근이 아니라 예상 못한 사고.
const data = response.data.items[0].name
// items가 빈 배열이면?
// → Cannot read property 'name' of undefined
// → 💥 크래시! 프로세스가 죽어버림
| 문제 | 설명 |
|---|---|
| SSH 끊으면 죽음 | yarn start는 SSH 세션의 자식 프로세스라서 부모가 죽으면 같이 죽는다 |
| 에러 나면 죽음 | 크래시 발생 시 수동으로 다시 켜야 한다 (새벽 3시에 죽으면?) |
| 서버 재부팅하면 날아감 | 컴퓨터 껐다 켜면 실행 중이던 프로그램이 전부 꺼진다 |
| 문제 | pm2 없이 | pm2 있으면 |
|---|---|---|
| SSH 끊으면? | 사이트 죽음 | 계속 살아있음 |
| 에러로 크래시? | 수동으로 재시작 | 자동 재시작 |
| 서버 재부팅? | 전부 수동 재시작 | 자동으로 다시 켜짐 |
# pm2 없이 (SSH 끊으면 죽음)
yarn start -p 5008
# pm2로 시작 (SSH 끊어도 살아있음)
pm2 start yarn --name "my-app" -- start -p 5008
| 부분 | 의미 |
|---|---|
pm2 start | pm2야, 프로세스 하나 시작해 |
yarn | yarn 명령어를 실행할 거야 |
--name "my-app" | 이 프로세스 이름을 "my-app"으로 붙여줘 |
-- start -p 5008 | yarn에게 전달할 옵션: start -p 5008 |
pm2 list
┌──────────┬────┬────────┬──────┬────────┐
│ name │ id │ ↺ │ status│ memory │
├──────────┼────┼────────┼──────┼────────┤
│ prod-app │ 0 │ 0 │ online│ 120mb │
│ dev-app │ 1 │ 0 │ online│ 98mb │
└──────────┴────┴────────┴──────┴────────┘
| 항목 | 의미 | 비유 |
|---|---|---|
| name | 프로세스 이름 | 셰프 이름 |
| id | 프로세스 번호 | 셰프 번호표 |
| ↺ | 재시작 횟수 | 셰프가 쓰러졌다 부활한 횟수 |
| status | 상태 | 근무중 / 퇴근 / 쓰러짐 |
| memory | 메모리 사용량 | 셰프가 차지하는 주방 공간 |
⚠️ ↺ 숫자가 계속 올라간다면?
앱이 계속 크래시 → pm2가 살리고 → 또 크래시 반복 중이라는 뜻.
코드에 심각한 버그가 있다는 신호!pm2 logs로 에러 확인 필요.
pm2 list # 실행 중인 프로세스 목록
pm2 logs my-app # 로그(기록) 보기
pm2 restart my-app # 재시작
pm2 stop my-app # 멈추기
pm2 delete my-app # 완전 삭제
pm2 monit # 실시간 모니터링
| 명령어 | 레스토랑 비유 |
|---|---|
pm2 list | "지금 누가 일하고 있어?" |
pm2 logs | "김셰프 오늘 뭐했어? 기록 보여줘" |
pm2 restart | "잠깐 쉬었다 다시 시작해" |
pm2 stop | "오늘 퇴근해" |
pm2 delete | "해고" |
pm2 monit | "주방 CCTV 실시간 감시" |
pm2 startup # 서버 켜지면 pm2가 자동 출근하게 설정
pm2 save # "이 셰프들 다시 불러야 해" 명단 저장
서버 재부팅되면 셰프들(프로세스)이 전부 퇴근한 상태인데,
주방 매니저(pm2)가 자동 출근(startup)해서 명단표(save)를 보고 셰프들을 다시 불러온다.
서버 재부팅
↓
pm2 자동 실행 (startup)
↓
저장된 명단 확인 (save)
↓
prod-app(5008), dev-app(5007) 자동 시작!
# 프로덕션 앱 (사용자용)
pm2 start yarn --name "prod-app" -- start -p 5008
# 개발 확인용 앱 (내부 테스트용)
pm2 start yarn --name "dev-app" -- devStart -p 5007
# 서버 재부팅 대비 설정
pm2 startup
pm2 save
이제 SSH를 끊어도, 에러가 나도, 서버가 재부팅돼도 두 앱 모두 살아남는다!
| 레스토랑 | 서버 |
|---|---|
| 주방 건물 | 서버 컴퓨터 |
| 셰프 | 프로세스 (yarn start) |
| 음식 | 사이트 |
| 주방 매니저 | pm2 |
| 셰프가 쓰러짐 | 크래시 (에러로 프로세스 죽음) |
| 음식이 안 나옴 | 사이트 접속 불가 |
| 자동 출근 알람 | pm2 startup |
| 출근 명단표 | pm2 save |
셰프(프로세스)가 쓰러지면 음식(사이트)이 안 나오고,
주방 매니저(pm2)가 셰프를 다시 깨워서 요리를 이어가게 한다.
가게가 닫혔다 열려도(재부팅) 매니저가 명단표 보고 셰프를 자동 소집한다.
🔮 다음 시간 (Day 9): Nginx란? 리버스 프록시 개념
사용자는https://my-site.com으로 접속하지,https://my-site.com:5008로 접속하지 않는다.
포트 번호 없이 접속하게 해주는 홀 매니저(Nginx)를 배운다!