Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 순열
- dfs
- CI/CD
- GIT
- 자바
- 그래프
- 그리드 알고리즘
- 트리
- 다이나믹 프로그래밍
- 알고리즘
- 이분탐색
- TCP
- SQL
- 재귀
- 컴퓨터 네트워크
- 자료구조
- 스프링
- 브루트포스
- HTTP
- 역방향 반복자
- 백준
- 분할정복
- AWS
- 그리드
- 도커
- 분할 정복
- github action
- Spring
- BFS
- 다이나믹프로그래밍
Archives
- Today
- Total
코딩성장스토리
무중단 배포 (Blue,Green 적용기) 본문
이번 프로젝트를 진행을 하면서 무중단 (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 재로드 되는 시간 제외하면 유지되어서
프론트 분들이 서버닫혀있다는 경험을 안한것 같다!
'기타' 카테고리의 다른 글
코드 리뷰 회고 (클린 코드, DB 모델링, 공통코드 or Enum) (0) | 2024.06.14 |
---|---|
도커 용량 줄이기 (1) | 2023.08.05 |
AWS 서비스들 알아보기 4 (RDS, Aurora, DynamoDB , Elasticache) (0) | 2023.05.11 |
AWS 서비스들 알아보기 3(SQS,Kinesis) (1) | 2023.05.09 |
AWS 서비스들 알아보기2(EC2,Elastic Beanstalk, Fargate,ECR,ECS,Lamda) (0) | 2023.05.04 |