개발 공부 기록/03. AWS

AWS에서 무중단 서비스를 구축해 보자.

박세류 2023. 11. 28. 18:47
새로운 Jar가 실행되기 전까지 (배포하는 동안) 기존 jar를 종료시키기 때문에 서비스가 중단된다.

Nginx를 이용한 무중단 배포를 해보자.

리버스 프록시?

  • 엔진엑스가 외부의 요청을 받아 백엔드 서버로 요청을 전달하는 것.
    • 리버스 프록시 서버(엔진엑스)는 요청을 전달한다.
    • 실체 요청에 대한 처리는 뒷단의 웹 애플리케이션 서버들이 처리한다.

 

리버스 프록시를 통해 무중단 배포 환경을 구축해보자!

 

1. 기존에 사용하던 EC2 인스턴스를 활용한다.

  • 엔진엑스는 80(http), 443(https) 포트를 할당한다.
  • 스프링부트 1 Jar는 8081 포트로 실행한다.
  • 스프링부트 2 Jar는 8082 포트로 실행한다.

엔진엑스와 하나의 스프링부트만 연결하고, 신규 버전으로 배포가 끝나면 reload를 통해 다른 스프링부트로 연결해주는 방식으로 무중단 배포를 한다!.

 

2. EC2 인스턴스에 엔진엑스 설치

1. 엔진엑스를 설치해준다.

sudo yum install nginx

 

2. 엔진엑스를 실행해준다.

sudo service nginx start

 

3. 엔진엑스와 스프링 부트를 연동해준다.

sudo vim /etc/nginx/nginx.conf

 

nginx 설정 파일 수정!

이후 엔진엑스를 재시작해준다. 80포트로 접속했을때 8080포트로 리다이렉션 되면 성공!

 

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

real1, real2 profile 생성 : 무중단 배포를 위한 profile을 src/main/resources 아래에 추가한다.

 

application-real1.properties
server.port=8081
spring.profiles.include=oauth,real-db
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.session.store-type=jdbc
application-real2.properties
server.port=8082
spring.profiles.include=oauth,real-db
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.session.store-type=jdbc

 

4. 엔진엑스 설정 수정

/etc/nginx/conf.d/에 service-url.inc라는 파일을 생성해주자.

sudo vim /etc/nginx/conf.d/service-url.inc

 

이후 set_$service_url http://127.0.0.1:8080; 코드를 입력한뒤 저장하고 나오자

 

이 파일을 엔진엑스가 사용할 수 있게 설정한다.

sudo vim /etc/nginx/nginx.conf

위와같이 location / 부분에 코드 추가해준다.

 

이후 nginx를 재시작 하고, 정상적으로 페이지가 호출되면 엔진엑스 설정이 잘 된것이다.

 

 5. 배포 스크립트 작성

무중단 배포를 진행할 스크립트들은 총 5개이다.

  • stop.sh: 기존 엔진엑스에 연결되어 있진 않지만, 실행 중이던 스프링 부트 종료
  • start.sh: 배포할 신규 버전 스프링 부트 프로젝트를 stop.sh로 종료한 'profile'로 실행
  • health.sh: 'start.sh'로 실행시킨 프로젝트가 정상적으로 실행됐는지 체크
  • switch.sh: 엔진엑스가 바라보는 스프링 부트를 최신 버전으로 변경
  • profile.sh: 앞선 4개 스크립트 파일에서 공용으로 사용할 포트 체크 로직

 

해서 2개가 배포되면 성공한것이다!

반응형