코딩성장스토리

무중단 배포 (Blue,Green 적용기) 본문

기타

무중단 배포 (Blue,Green 적용기)

까르르꿍꿍 2023. 11. 21. 15:14

이번 프로젝트를 진행을 하면서 무중단 (Blue,Green) 배포를 시도해보았다!

 

무중단 배포란 ?
배포를 할 떄에 서버가 잠시 중단되는 현상을 방지하기 위한 것이다!

 

Blue,Green 무중단 배포란?

서버 2대(하나는 blue,하나는 green) 을 가동시키고 번갈아가면서 배포시키는 것이다. 

아래 그림을 참고로 설명하겠다!

위의 사진처럼 blue서버에 사람들이 접근할 하고 있는데 새로운 버전을 배포를 해야하는 상황이 올 때가 있을 것이다!

그럼 새로운 버전을 Green 서버에 배포를 하고 
배포가 완료 되면 유저를 Green서버에만 접근가능하게 변경해준다!

그 다음 Blue서버를 다운 시켜 주면 된다!

 

 

Blue,Green 구현 

나는 도커로 컨테이너를 두개 띄웠다.(하나는 blue,하나는 green) 

 

Docker-Compose

version: '3'
services:

  blue:
    container_name: blue
    image: {container}/blue-green
    expose:
      - 8080
    ports:
      - 8080:8080

  green:
    container_name: green
    image: {container}/blue-green
    expose:
      - 8080
    ports:
      - 8081:8080

 

 

Nginx.conf 설정

그 다음 nginx.blue.conf(blue 서버 nginx 설정 파일) , nginx.green.conf(green서버 nginx 설정파일) 을 만들어 준다.
저는 https도 설정해서 인증서 적용되게 해주었습니다!

nginx.blue.conf - (green은 포트번호만 변경)

worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

    events {
        worker_connections  1024;
        }

        http {

        include       mime.types;

     
        server {

        server_name [도메인 이름]
        client_max_body_size 20M;    // 이건 해두는게 좋습니다..
        // 저는 이거 안하다고 용량이 큰 파일(multiparfile)이 전달이 안되어서 고생했던 기억이..
        location / {

        # GREEN - 8081 포트로 연결합니다.
        # BLUE 설정파일은 이부분의 포트만 8080로 변경해주면 됩니다.
        proxy_pass http://127.0.0.1:8081;
        proxy_set_header Host $host;

        }
        
        //https 적용

        listen 443 ssl; # managed by Certbot

        ssl_certificate /etc/letsencrypt/live/{도메인}/fullchain.pem; # managed by Cert>
        ssl_certificate_key /etc/letsencrypt/live/{도메인}/privkey.pem; # managed by Ce>
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
        }

        # 80 포트로 접근시 443 포트로 리다이렉트 시켜주는 설정
        server {

        return 301 https://$host$request_uri;

        listen 80;
        server_name {도메인 주소};
        return 404; # managed by Certbot
        }

}

 

 

deploy.sh 설정

그리고 배포할때마다 서버 변경해주는 명령어 실행시켜줄 deploy.sh 설정

#!/bin/bash

IS_GREEN_EXIST=$(docker ps | grep green)
DEFAULT_CONF="/etc/nginx/nginx.conf"     // nginx.conf

# blue가 실행 중이면 green을 up합니다.
if [ -z $IS_GREEN_EXIST ]; then
  echo "### BLUE => GREEN ####"
  echo ">>> green image를 pull합니다."
  docker-compose pull green
  echo ">>> green container를 up합니다."
  docker-compose up -d green
  sleep 3
  echo ">>> nginx를 다시 실행 합니다."
   //설정해 두었던 nginx.green.conf를 nginx.conf 파일로 옮겨줌
  sudo cp /etc/nginx/nginx.green.conf /etc/nginx/nginx.conf 
 //nginx 재시동해서 설정적용
  sudo nginx -s reload
  echo ">>> blue container를 down합니다."
  docker-compose stop blue

# ^Hgreen이 실행 중이면 blue를 up합니다.
else
  echo "### GREEN => BLUE ###"
  echo ">>> blue image를 pull합니다."
  docker-compose pull blue
  echo ">>> blue container up합니다."
  docker-compose up -d blue
  sleep 3
  echo ">>> nginx를 다시 실행 합니다."
  sudo cp /etc/nginx/nginx.blue.conf /etc/nginx/nginx.conf
  sudo nginx -s reload
  echo ">>> green container를 down합니다."
  docker-compose stop green
  fi

 

이러고 github action으로 CI/CD 구축하면 끝!

무중단 배포란 것을 처음 알게 되었는데 확실히 서버 배포하는 동안에 nginx 재로드 되는 시간 제외하면 유지되어서 
프론트 분들이 서버닫혀있다는 경험을 안한것 같다!