Skip to content

[배포] 블루그린 배포

aqswa edited this page Aug 4, 2023 · 2 revisions

무중단 배포 기록, 트러블슈팅

nginx

웹 서버로 nginx를 두고 reverse proxy해서 컨테이너로 돌아가는 WAS 하나로만 전달하려고 했으나 nginx 설정에서 알 수 없는 문제가 있어서 일단 docker 실행을 80포트로 받아서 8080포트로 실행하는 명령어로 수정했었다.

nginx 설정을 읽어도 어디서 잘못되었는지 감이 오지 않아서 구조를 아예 다 바꿔야겠다고 결정하고 시간이 있으면 해보려고 했던 blue-green을 찾아봤다.

blue-green은 사실 서버 2대를 사용해서 번갈아가며 배포해서 클라이언트 단에서 중단을 느끼지 못하게 하는 거라고 하는데 EC2 두 개 쓸 수는 없기 때문에 도커와 nginx, codedeploy를 이용한 무중단을 했다.

sudo vim /etc/nginx/sites-enabled/default 을 해서 proxy설정을 바꿨다.

upstream blog-api-server {
        least_conn;
        server 127.0.0.1:8081 max_fails=3 fail_timeout=10s;
        server 127.0.0.1:8082 max_fails=3 fail_timeout=10s;
}

server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        if ($http_x_forwarded_proto != 'https') {
                return 301 https://$host$request_uri;
        }

        location / {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header HOST $http_host;
                proxy_set_header X-NginX-Proxy true;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://blog-api-server;
                proxy_redirect off;
        }
 }

https://www.joinc.co.kr/w/man/12/proxy 에서 nginx에 대해 배울 수 있었다.

docker

디폴트인 docker-compose.yml과 다른 이름을 가진 docker-compose파일을 지정하는 경우 -f 옵션을 사용

docker-compose -f custom-compose-file.yml start

Untitled2

Untitled3

배포에는 문제가 없지만 커밋을 할 때마다 컨테이너가 blue ↔ green으로 바뀌지 않고 계속 blue로만 배포가 되는 문제가 있었는데

docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml ps | grep running

에서 docker-compose ps를 했을 때 업데이트가 되었는지 running이 아닌 Up이라고 표시되어서 실행 중인 컨테이너를 찾지 못하는 거였다. Up으로 바꿔주니 무중단으로 배포가 되었다.

Untitled4

#!/bin/bash

cd /home/ubuntu/app

DOCKER_APP_NAME=spring

# 실행중인 blue가 있는지
EXIST_BLUE=$(docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml ps | grep Up)
echo "$EXIST_BLUE" >> debug.log

# green이 실행중이면 blue up
if [ -z "$EXIST_BLUE" ]; then
	echo "blue up" >> debug.log
	docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml up -d --build

	sleep 30

	docker-compose -p ${DOCKER_APP_NAME}-green -f docker-compose.green.yml down
	docker image prune -af # 사용하지 않는 이미지 삭제

# blue가 실행중이면 green up
else
	echo "green up" >> debug.log
	docker-compose -p ${DOCKER_APP_NAME}-green -f docker-compose.green.yml up -d --build

	sleep 30

	docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml down
	docker image prune -af
fi

shell

shell script에서 에러 로그 기록하려면

‘>’ - 명령 1회 동작 시 결과를 파일로 저장, 이후 동일한 파일명 사용 시 파일 덮어씌움

‘>>’ - 명령 1회 동작시 결과를 파일로 저장, 이후 동일한 파일명 사용 시 마지막 저장에 내용 추가됨.

ex)

echo “blue up” >> debug.log

if문에서 -z 옵션은?

string이 empty인지 확인하기 위해서 사용됨. 만약 string이 empty라면 if block 안에 있는 코드를 실행하고 그렇지 않다면 else block을 실행한다.

용량이 부족해서 배포가 안되면

서비스 기능이 꽤 많다 보니 디스크 용량이 부족해서 코드디플로이, 도커 등 아무 명령어도 실행이 안되는 문제가 생김. 스웹 메모리만 적용해도 2GB이니 그냥 첨부터 8GB는 안쓰는게 좋을 것 같다.

Untitled5

스토리지에서 볼륨을 늘려보았는데 반영이 되지 않음. 반영되는데 1시간 정도 걸린 것 같다. 계속 재부팅했는데 반영이 느림. 그동안 공간을 만들기 위해 여러가지를 해봤다.

폴더 별 용량 확인 명령어 → 불필요한 로그 등 용량 큰 파일을 삭제

sudo du -shx /* | sort -h

전체 메모리 사용량 확인 명령어 → 얼마나 남았는지 확인할 때

df -h

불필요한 리소스 제거 명령어

docker system prune -a -f

커널 삭제 명령어

sudo apt autoremove --purge