무중단 배포를 구축해보자 - 환경 편
Server안녕하세요. Lovefield입니다.
블로그를 운영하면서 다양한 상황들을 겪었습니다. 서버가 죽어있기도 했고 실수로 설정을 잘못하기도 했죠. 최근에는 업데이트를 자주 하게 되면서 무중단 업데이트를 구성해야 할 필요성을 느꼈습니다. 결국 기존의 환경을 수정하는 방향으로 결정하고 빠르게 무중단 환경을 구성하기로 했습니다.
단일 인스턴스 환경에서 Docker를 이용해 구축할 예정이었기에 위와 같이 서버 구성도를 작성했습니다. 총 7개의 컨테이너가 필요한 구성입니다. Nginx 컨테이너를 Load Balance 역할로 사용해 Front End 컨테이너와 Back End 컨테이너를 연결할 생각입니다. AWS를 이용하지 않은 이유는 단순합니다. 비싸거든요! Instance 4개와 S3, RDS, LB 등의 사용을 생각하면 일개 블로그를 운영하기에는 너무 큰 비용이 필요합니다. 결국 Docker를 이용할 수밖에 없었죠.
docker-compose.yml
YAML
name: blog
services:
database:
…
fileserver:
…
backend-blue:
container_name: back-blue
ports:
- "8002:8082"
backend-green:
container_name: back-green
ports:
- "8001:8082"
frontend-blue:
container_name: front-blue
ports:
- "3002:3000"
frontend-green:
container_name: front-green
ports:
- "3001:3000"
load-balance:
container_name: load-balance
image: nginx:1.27.3-perl
volumes:
- ./nginx.conf:/etc/nginx/conf.d/nginx.conf
ports:
- "8000:8000"
- "9000:9000"
depends_on:
- backend-blue
- backend-green
- frontend-blue
- frontend-green
docker-compose.yml 파일을 위와 같이 작성했습니다. 설명을 위해서 중요한 설정만 남긴 상태입니다. Front End와 Back End는 각각 Blue와 Green 컨테이너를 가지고 있습니다. load-balance 컨테이너가 Blue와 Green 컨테이너를 엮어서 접근 처리를 해줄 예정인데요. 각각 열린 포트는 다음 역할을 수행합니다.
- 8000 : Nginx의 8000번 포트를 연결하며 이 포트는 Front End의 Blue와 Green이 연결되어 있습니다.
- 9000 : Nginx의 9000번 포트를 연결하며 이 포트는 Back End의 Blue와 Green이 연결되어 있습니다.
- 3001 : Front End Green 컨테이너의 Health Check을 위한 포트입니다.
- 3002 : Front End Blue 컨테이너의 Health Check을 위한 포트입니다.
- 8001 : Back End Green 컨테이너의 Health Check을 위한 포트입니다.
- 8002 : Back End Blue 컨테이너의 Health Check을 위한 포트입니다.
nginx.conf
Nginx config
server{
listen 8000;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://frontend-app;
}
}
upstream frontend-app {
least_conn;
server frontend-blue:3000;
server frontend-green:3000;
}
server{
listen 9000;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://backend-app;
}
}
upstream backend-app {
least_conn;
server backend-blue:8082;
server backend-green:8082;
}
Nginx Container 설정을 위와 같이 구성해 줍니다. 8000포트로 들어올 경우 frontend-blue:3000 와 frontend-green:3000 중 접속 수가 적은 쪽으로 연결을 시도합니다. 9000포트로 들어올 경우 backend-blue:8082 와 backend-green:8082 중 접속 수가 적은 쪽으로 연결을 시도합니다. 한쪽이 연결되지 않는다면 연결이 가능한 쪽으로 연결을 시도합니다.
이렇게 해서 환경 구성이 끝났습니다. 무중단 배포를 위한 배포 스크립트 구성은 다음 글에서 작성하도록 하겠습니다. 감사합니다.