nextjs에 무중단 배포방법 파악

study, share · 2021-9-29

← 리스트로

nextjs에 무중단 배포방법 파악

  • 목차
    • 개요
    • pm2를 이용한 Rolling Deployment(채택 방법의 기술 설명)
      1. pm2 제공 기능
      2. nextjs에서 pm2의 무중단 배포 기능 사용시 문제점
      3. nextjs에서 pm2의 무중단 배포 기능 사용시 문제점의 해결방법
    • 결론

개요

무중단 배포란 서버를 내리지 않고 서비스 제공에 영향 없이 웹소프트웨어를 업데이트하는 걸 말한다. 무중단 배포 방법에는 롤링 배포블루/그린 배포가 있다.

롤링 배포는 서비스 되는 서버를 한 대씩 구버전에서 새 버전으로 교체하는 것이며, 블루/그린 배포는 서비스 되는 서버는 그대로 놔두고 배포를 위한 서버그룹을 새로 구축하여 단번에 바꾸는 것이다.

블루/그린 배포 방법이 이상적이긴 하나 서비 비용이 많이 들고 클라우드 서버를 이용하는 것이 아니라면 물리적 서버 하나를 더 관리해야하는 이슈가 있어서 비효율적이다.

우리의 경우 블루/그린 배포를 이용하기 위해서는 nginx 서버를 직접 컨트롤 해야 하는데 부담이 있으며 배포를 위한 서버를 실서비스 서버군과 동일하게 구축하는데 어려움이 있다.

또한 롤링 배포는 우리가 채택한 pm2에서 reoload 명령어를 통해 간편하게 이용할 수 있는 이점이 있다.

구축 편의성이나 안정성을 고려했을때 rolling 배포 방법이 맞다고 판단되며 Nginx는 우리 프론트팀이 직접 제어하기 까다로운 부분이므로 pm2에서 제공하는 reload 방법을 통해 배포하는 방법을 서치하여 공유한다.

pm2를 이용한 Rolling Deployment(채택 방법의 기술 설명)

1. pm2 제공 기능

pm2 reload를 하면 `pm2는 실행중인 프로세스들을 하나씩 재시작 하며 실행중이지 않는 node 프로세스는 일을 안시키므로 무중단 배포에 문제가 없어 보인다.

보통 가벼운 앱인 경우 그냥 reload를 해도 문제가 없지만 node 앱이 무거울 경우 프로스세를 죽이거나 다시 시작하는데 시간이 걸릴 수 있어서, 프로세스가 시작하거나 죽는 도중에 http요청이 오면 트랙픽 유실이 생길 수 있다.

그러므로 node 프로세스는 pm2에게 자신이 완전히 안전하게 죽은 타이밍과 시작되어 정상적인 서비스가 가능한 상태를 알려주는 기능이 있어야 한다.

다행이도 pm2는 이를 위한 기능을 제공하며 문서에도 잘 설명되어 있다.

2. nextjs에서 pm2의 무중단 배포 기능 사용시 문제점

pm2가 node환경의 무중단 배포 기능을 잘 지원하지만 nextjs는 자신들만의 서버엔진을 구현하였으므로 사용자는 nextjs 프로세스가 완전히 죽거나 시작되는 시점을 알 수 없으며 pm2에게 신호를 알려줄 수 있는 방법이 없다.

3. nextjs에서 pm2의 무중단 배포 기능 사용시 문제점의 해결방법

다행이도 nextjs에서는 커스텀 서버 기능을 사용하면 100% 프로그래밍 방식으로 서버를 시작할 수 있으며, 따라서 프로세스가 죽는 타이밍과 시작되는 타이밍을 알 수 있으므로 해결방법이 될 수 있다.

하지만 nextjs서버가 제공하는 ssg기능이나 정적 증분 재생과 같은 기능을 사용할 수 없으며 nextjs가 클라우드 서비스로 제공하는 Vercel에 배포 할 수 없다.

결론

무중단 배포를 위해 nginx proxy를 직접 컨트롤 할 수 있을경우, 우리가 프로세스에 직접 이벤트 제어를 할 필요가 없이 무중단 배포를 할 수 있으므로 nextjs의 모든 기능을 살려서 사용 가능한 걸로 보인다.

하지만 우리는 nginx의 지원 없이 pm2 기능을 사용한 무중단 배포를 해야하기 때문에 nextjs의 커스텀 서버기능 이용이 불가피해 보인다.

또한 대선 사이트의 경우는 ssg가 굳이 필요 없어 보이므로 nextjs 커스텀 서버 기능 사용이 옳아 보인다.

결론: 무중단 배포 방법으로 pm2 reload 방식과 nextjs 커스텀서버 기능을 사용하며 nextjs 자체 서버기능은 포기한다.