-
Notifications
You must be signed in to change notification settings - Fork 3
[배포] 블루그린 배포
웹 서버로 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-compose.yml과 다른 이름을 가진 docker-compose파일을 지정하는 경우 -f 옵션을 사용
docker-compose -f custom-compose-file.yml start
배포에는 문제가 없지만 커밋을 할 때마다 컨테이너가 blue ↔ green으로 바뀌지 않고 계속 blue로만 배포가 되는 문제가 있었는데
docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml ps | grep running
에서 docker-compose ps를 했을 때 업데이트가 되었는지 running이 아닌 Up이라고 표시되어서 실행 중인 컨테이너를 찾지 못하는 거였다. Up으로 바꿔주니 무중단으로 배포가 되었다.
#!/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 script에서 에러 로그 기록하려면
‘>’ - 명령 1회 동작 시 결과를 파일로 저장, 이후 동일한 파일명 사용 시 파일 덮어씌움
‘>>’ - 명령 1회 동작시 결과를 파일로 저장, 이후 동일한 파일명 사용 시 마지막 저장에 내용 추가됨.
ex)
echo “blue up” >> debug.log
if문에서 -z 옵션은?
string이 empty인지 확인하기 위해서 사용됨. 만약 string이 empty라면 if block 안에 있는 코드를 실행하고 그렇지 않다면 else block을 실행한다.
서비스 기능이 꽤 많다 보니 디스크 용량이 부족해서 코드디플로이, 도커 등 아무 명령어도 실행이 안되는 문제가 생김. 스웹 메모리만 적용해도 2GB이니 그냥 첨부터 8GB는 안쓰는게 좋을 것 같다.
스토리지에서 볼륨을 늘려보았는데 반영이 되지 않음. 반영되는데 1시간 정도 걸린 것 같다. 계속 재부팅했는데 반영이 느림. 그동안 공간을 만들기 위해 여러가지를 해봤다.
폴더 별 용량 확인 명령어 → 불필요한 로그 등 용량 큰 파일을 삭제
sudo du -shx /* | sort -h
전체 메모리 사용량 확인 명령어 → 얼마나 남았는지 확인할 때
df -h
불필요한 리소스 제거 명령어
docker system prune -a -f
커널 삭제 명령어
sudo apt autoremove --purge