Skip to content

서버 인프라 구조 및 배포 파이프라인 개선

SeungJu Baek edited this page Mar 30, 2023 · 3 revisions

현재 인프라 구조와 배포 과정의 문제점

image


  • 현재 인프라는 프론트엔드 정적 파일을 제공하는 Web 서버가 /api 로 들어온 요청을 백엔드 리버스 프록시 서버로 라우팅 해주는 구조이다.

이같은 상황에서 다음과 같은 문제가 발생할 수 있다.

  1. 전체 서비스가 프론트엔드 nginx에 의존적이다.
  2. 서비스를 위해 두개의 설정 front nginx, backend nginx를 관리해야한다
  3. 파일 전송과 같은 과정이 두개의 서버를 거쳐서 발생하기 때문에 업로드 속도 문제가 발생한다(확인 필요)
  4. 백엔드 요청/응답이 두개의 nginx 서버를 거친다
  5. Nginx는 유연한 로드밸런싱 기능을 제공하지 않으므로 하나의 서버가 죽을 경우 요청을 살아있는 서버로 자동으로 분배해주지 않는다.
  6. 4의 문제는 배포과정에서도 서비스 중단을 야기한다. 서버를 하나씩 배포하는 과정에서 서버가 종료되고 다시 시작 될 때까지 서비스가 중단되기 때문에 무중단 배포를 구현하기 까다롭다.

haproxy 서버를 사용해 이같은 문제를 개선해보고자 한다.

개선 포인트

  • haproxy 서버 적용
  • 배포 스크립트를 수정해 무중단 배포 구현

haproxy

config

#---------------------------------------------------------------------
# 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 }

blue-green deployment

https://www.haproxy.com/documentation/hapee/latest/api/runtime-api/reference/set-map/

구현 과정에서 발생한 이슈

  1. Permission denied
    image

solution
image

Clone this wiki locally