배포 아키텍처: 무중단 프로덕션 시스템
이 글에서는 자동 재시작과 무중단으로 웹사이트를 배포하고 운영하는 방법을 설명합니다.
문제: 수동 배포는 위험합니다
기존 배포 방식은 다음을 필요로 합니다:
-
수동 서버 재시작: 다운타임 발생
-
서비스 모니터링: 누군가가 충돌을 감시해야 함
-
코드 업데이트: SSH 접속 및 수동 단계 필요
-
롤백: 문제 발생 시 수동 처리
이 방식은 확장성이 없으며 업데이트 중 다운타임이 발생합니다.
해결책: Systemd를 통한 자동화 배포
우리는 애플리케이션을 관리하기 위해 systemd를 사용합니다(인프라 개요 참조):
-
자동 재시작: 충돌 또는 코드 변경 시 자동 재시작
-
무중단: 우아한 워커 재시작
-
로깅: 중앙 집중식 로그 관리
-
프로세스 관리: 워커 생명주기 처리
서버 인프라
프로덕션 서버
프로덕션 서버는 공개 웹사이트를 호스팅합니다:
-
목적: 제품 카탈로그와 이커머스를 제공하는 공개 웹사이트
-
모듈: "web"만
-
환경: 프로덕션 (Gunicorn + systemd)
-
접근: 공개 (로그인 불필요)
애플리케이션 서버
Gunicorn
Gunicorn은 프로덕션 웹 서버입니다:
- 다중 워커: 여러 워커 프로세스
Systemd 통합
Systemd가 Gunicorn을 관리합니다:
-
자동 시작: 서버 부팅 시
-
자동 재시작: 충돌 또는 코드 변경 시
-
로깅: Systemd 저널 통합
-
프로세스 관리: 워커 생명주기
구성
환경 구성
구성은 환경별로 다릅니다:
-
구성 파일: 환경별 설정
-
JSON 형식: 키-값 쌍
-
환경 변수: 비밀값과 API 키
-
모듈 활성화: 로드되는 기능 제어
정적 에셋
정적 에셋은 CloudFront CDN과 함께 S3에서 제공됩니다:
-
S3 버킷: 정적 파일을 위한 객체 저장소
-
CloudFront: 전역 에셋 전송을 위한 CDN
-
캐싱: 정적 콘텐츠에 대한 긴 TTL
-
버전 관리: 버전 번호를 통한 캐시 무효화
배포 프로세스
코드 배포
코드는 Git을 통해 배포되며 systemd가 애플리케이션 서비스를 관리합니다:
- 커밋 및 푸시: 변경사항을 Git 저장소에 푸시
- 서버에서 풀: 코드를 프로덕션 서버로 풀
- Systemd 재시작: 충돌 시 서비스 자동 재시작
구성 배포
구성은 코드와 별도로 관리됩니다:
- 구성 파일: Git의 JSON 구성 파일
- 환경 변수: 환경에서 로드되는 비밀값
- 모듈 활성화: 로드되는 기능 제어
모니터링
헬스 체크
헬스 엔드포인트가 서버 상태를 모니터링합니다:
-
헬스 엔드포인트: 기본 헬스 체크
-
데이터베이스 체크: 데이터베이스 연결성
-
캐시 체크: 캐시 연결성
로깅
로그는 여러 위치에 저장됩니다:
-
Gunicorn 오류 로그: 애플리케이션 오류
-
Gunicorn 접근 로그: HTTP 요청
-
서비스 로그: Systemd 저널
요약
배포 아키텍처는 다음을 제공합니다:
-
Gunicorn: 프로덕션 WSGI 서버
-
Systemd: 자동 재시작 및 프로세스 관리
-
Git 배포: 코드 및 구성 관리
-
S3 + CloudFront: 정적 에셋 전송
-
헬스 모니터링: 헬스 체크 엔드포인트
-
로깅: 오류 및 접근 로그