중단 배포를 하게 되면 배포를 할 때마다 서비스가 중단된다는 것인데요. 하루에 한 번씩 배포를 한다고 하면 하루에 한번은 무조건 다운타임을 가져가는 수 밖에 없습니다.
해당 방법을 개선한 배포방식이 바로 무중단 배포 방식이라고 합니다.
현재 스프링부트 프로젝트를 GitHub Actions 를 활용하여 배포 자동화 환경을 구축하였기 때문에 develop 브랜치에 Push만 되면 자동으로 빌드와 테스트 그리고 배포까지 이루어진다.
그러나 배포하는 시간 동안 어플리케이션이 종료가 된다는 문제점이 있다.
긴 시간은 아니지만 새로운 Jar가 실행되기 전까지 기존의 jar를 종료시키기 때문에 서비스가 일부 시간동안 중단된다.
이렇게 서비스를 중단시키지 않고 배포하는 것을 무중단 배포라고 한다.
Nginx를 이용해서 무중단 배포를 하려는 이유는 가장 저렴하기 때문이다.
기존에 쓰던 EC2를 그대로 적용하면 돼서 배포를 위해 AWS EC2 인스턴스를 하나 더 생성할 필요가 없다.
무중단 배포의 운영 과정은 다음과 같다.
1. EC2(리눅스 서버)에 Nginx 1대와 스프링부트 jar 2대를 사용한다.
-> Nginx는 80(http), 443(https) 포트를 사용하고 스프링부트1(8081), 스프링부트2(8082) 각각 사용한다.
2. 사용자는 서비스 주소로 접속한다 (80 또는 443 포트)
3. Nginx는 사용자의 요청을 받아 현재 연결된 스프링부트로 요청을 전달한다.
4. 배포가 필요하면 Nginx와 연결되지 않은 스프링부트로 배포한다.
5. 배포가 끝나고 정상적으로 배포를 한 스프링부트가 구동중인지 확인한다.
6. 5에서 확인한 스프링부트가 정상 구동중이면 nginx reload를 통해 해당 스프링부트의 포트를 nginx가 연결하도록 한다.
7. 만약 배포시 문제가 생겨서 rollback이 필요하면 ngix가 배포전에 연결되었던 스프링부트를 다시 연결하면 된다.
무중단 배포보다 테스트 코드가 우선사항이라고 판단해서 무중단 배포 작업은 미루어 졌다.