24시간 365일 중단 없는 서비스를 만들자

박일한·2021년 11월 23일
0

CI의 환경은 구축이 되어 있지만 배포시 중단이 된다는 문제가 있다.
프로젝트의 크기에 따라 배포시간이 다르겠지만 서비스가 클수록 배포시간이 길어지기 때문에 문제가 발생될 소지가 크다.

무중단 배포 소개

서비스를 중지하지앙ㄶ고 배포할 수있는 방법을 무중단 배포라고 합니다.
1. aws에서 블루 그린 무중단 배포
2. 도커를 이용한 웹서비스 무중단 배포
이외에도 많지만 여기서 소개되는 방식은 엔진엑스(nginx)를 사용할 것이다.
엔진엑스 : 웹서버, 프록시, 캐싱, 로드밸런싱, 미디어스트리밍등을 위한 오픈소스
리버스프록시 : 외부이 요청을 받아 백앤드 서버로 요청을 전달
이번에 구축할 내용은 엔진엑스 리버스프록시 구축이다.
엔진엑스를 이용하는이유는 사용하기 쉽고 가장 저렴하기 때문이다.
구조 : 리눅스 서버에 엔진액스 1대와 스프링 jar를 2대 사용
1) 엑진엑스는 80(http), 443(https) 포트를 할당합니다.
2) 스프링부트1은 8081포트로 실행합니다.
3) 스프링부트2은 8082포트로 실행 합니다.
운영과정
1) 사용자는 서비스 주소로 접속합니다.
2) 엔진엑스는 사용자의 요청을받아 현재 연결된 스프링 부트 요청을 전달
3) 스프링부트2는 엔진엑스와 연결된 상태가 아니니 요청받지 못한다.
4) 배포하는동안에 서비스는 중단되지않는다.
서비스1이 운영중일때 배포는 서비스2에 배포가 됨으로 중단되지않는다.
5) 배포가 끝나고 서비스(부트2)에 구동이 정상인지 확인하다.
6) 구도잉 정상이면 서비스1 -> 서비스2를 바라보게 한다.
7) 배포시 이런식으로 순환구조가 되어 무중단 배포가 일어난다.

엔진엑스 설치와 스프링부트 연동하기

  1. 엔진엑스 설치
    sudo yum install nignx
  2. 엔진엑스 시작
    sudo service nginx start
    엔진엑스가 설치되면 Starting nginx : [ OK ] 라는 문구가 나타난다.
  3. 보안그룹 추가
    nginx는 80포트를 사용할거기 떄문에 기존 EC2보안정책에 80포트를 추가한다.
  4. SNS로그인 리디렉션 추가
    8080이 아닌 80포트로 주소가 변경되어 뒤에 :8080을 제거하거나 제외한 주소를 다시 추가한다.
  5. 엔진엑스와 스프링부트 연결하기
    sudo vim /etc/nginx/nginx.conf 를 실행하면 엔진엑스 설정파일이 열린다.
    그럼 location부분에 아래와 같이 추가한다.

    위에 Service_url이 없을시 localhost:8080을 입력해 놓으면 된다.
  6. 엔진엑스 재시작
    sudo service nginx restart
    엔진엑스를 재시작하면 화면이 변경이 되어있다.

무중단 배포 스크립트 만들기

  1. profile API 추가

    이 api는 무중단 배포시 8081을 사용할지 8082를 사용할지 판단하는 기준이 된다.

작동원리는 현재 실행중인 active profile을 가져오고 배포에 사용될 profile이 하나라도 있으면 그값을 반환하게 한다.
2.applicaiton-real1(real2).properties 작성

해당 파일들을 작성하는데 real1은 port가 8081, real2는 8082로 작성하여 만든다.
3. 엔진엑스 설정 수정

  • 엔진엑스 파일 설정 생성
    • sudo vim /etc/nginx/conf.d/service-url.inc를 생성
    • set $service_url http://127.0.0.1:8080; 작성 후 저장
  1. 엔진엑스 conf파일 수정
    상단의 service_url부분을 그대로 적용시키면 된다.
  2. 엔진엑스 재시작
  3. 배포 스크립트들 작성
    • mkdir ~/app/step3 && mkdir `~/app/step3/zip 폴더 생성
    • appsepec.yml 수정
    • script 폴더에
      stop,start,health,swith,profile sh파일을 생성한다.
  4. build.gradle에 version부분수정
    new Date().format("yyyyMMddHHmmss") 추가로 이부분을 입력한다.(중복방지)
    이럼으로써 무중력 배포는 끝이 났다.

인텔리제이 설정부터 무중단배포까지 완성이 되었다.
git주소 : https://github.com/pih6585/aws-webservice

최종 챕터

이책을 통해서 토이프로젝트로 무중단 배포까지 시연을 해봤는데 너무 잼있었다.
이다음에 면접 준비하기전까지 스프링부트 JPA 프로젝트 책을 통해서 배포까지 다시한번 해봐야겠다.

profile
긍정적인 삶을 갖자~~

0개의 댓글