-
Notifications
You must be signed in to change notification settings - Fork 0
서버 인프라 구조 및 배포 파이프라인 개선
SeungJu Baek edited this page Mar 30, 2023
·
3 revisions
- 현재 인프라는 프론트엔드 정적 파일을 제공하는 Web 서버가 /api 로 들어온 요청을 백엔드 리버스 프록시 서버로 라우팅 해주는 구조이다.
이같은 상황에서 다음과 같은 문제가 발생할 수 있다.
- 전체 서비스가 프론트엔드 nginx에 의존적이다.
- 서비스를 위해 두개의 설정 front nginx, backend nginx를 관리해야한다
- 파일 전송과 같은 과정이 두개의 서버를 거쳐서 발생하기 때문에 업로드 속도 문제가 발생한다(확인 필요)
- 백엔드 요청/응답이 두개의 nginx 서버를 거친다
- Nginx는 유연한 로드밸런싱 기능을 제공하지 않으므로 하나의 서버가 죽을 경우 요청을 살아있는 서버로 자동으로 분배해주지 않는다.
- 4의 문제는 배포과정에서도 서비스 중단을 야기한다. 서버를 하나씩 배포하는 과정에서 서버가 종료되고 다시 시작 될 때까지 서비스가 중단되기 때문에 무중단 배포를 구현하기 까다롭다.
haproxy 서버를 사용해 이같은 문제를 개선해보고자 한다.
- haproxy 서버 적용
- 배포 스크립트를 수정해 무중단 배포 구현
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 local1
maxconn 4000 # 프로세스 당 최대 연결 수치
daemon # Background 실행
stats socket /var/lib/haproxy/stats mode 660 level admin expose-fd listeners # 통계 관련 정보에 대한 위치를 지정
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults # front, back, listen에 관한 전역 섹션
mode http # http 프로토콜 사용하는 로드밸런싱 모드
log global # 로그는 global 설정을 따름
option httplog # 로그 디테일을 높임
option dontlognull # 로그 비대화 방지를 위해 probe(정찰, 스캔) 잡다한 기록은 남기지 않음
retries 3 # 백엔드 서버가 다운되었다고 판단하는 요청 횟수
option forwardfor # X-Forwarded-For를 헤더에 추가
option http-server-close # 실제 서버와 클라이언트 간 연결이 종료 될 시 유휴상태로 대기하지 않고 서버에서 Handshake를 종료하여 더 빠르게 새로운 세션을 준비할 수 있도록 하는 옵션
timeout http-request 2m # 요청타임아웃 시간 설정
timeout queue 2m
timeout connect 2m
timeout client 2m
timeout server 2m
timeout http-keep-alive 2m
timeout check 2m
#---------------------------------------------------------------------
# FrontEnd Configuration
#---------------------------------------------------------------------
frontend http # 들어오는 요청에 대한 설정
bind *:8080 # 8080 번으로 들어오는 요청을 처리
http-request set-header X-Forwarded-Proto http
use_backend backend-application if { path_beg /api/ }
default_backend front-nginx
# front nginx
backend front-nginx
server s1 b-shop-front:8080 check
#---------------------------------------------------------------------
# BackEnd Platform Configuration
#---------------------------------------------------------------------
backend backend-application
http-request replace-path /api(/)?(.*) /\2
balance roundrobin # 부하분산 알고리즘
# health check
option httpchk
http-check send meth GET uri /application/health
# configure platform instances
http-check expect status 200
server s2 b-shop-server-1:8080 check inter 1s fastinter 500ms
server s3 b-shop-server-2:8080 check inter 1s fastinter 500ms
#---------------------------------------------------------------------
# HAProxy Monitoring Config
#---------------------------------------------------------------------
listen stats
bind *:9000
mode http
option dontlog-normal
stats enable
stats realm Haproxy\ Statistics
stats uri /haproxy
http-request use-service prometheus-exporter if { path /metrics }
https://www.haproxy.com/documentation/hapee/latest/api/runtime-api/reference/set-map/
- Permission denied
🏷️ 설계 문서
📚 팀 컨벤션
- Issue 작성 가이드
- Merge Request 작성 가이드
- Git 브랜치 전략
- Commit 컨벤션
- 백엔드 코드 컨벤션
- 객체 및 메서드생성 규칙
- Ground Rule
- Request Response 규칙
🔧 Setting
✍ 스프린트 기록