HAProxy 설치와 Reverse Proxy Server 구축

Harry Lee·2023년 4월 9일
0
post-thumbnail

개요

HAProxy 설치 및 Custom Health check를 적용한 Reverse Proxy Server을 구현


설치

  • Ubuntu 20.04 환경에서 세팅
  1. sudo apt get update
  2. LTS 버전(2.6-LTS) 다운로드(https://haproxy.debian.net/ 참고. 본인 환경, 버전에 맞는 커맨드를 알려줌)
  3. apt-get install --no-install-recommends software-properties-common
  4. add-apt-repository ppa:vbernat/haproxy-2.6
  5. apt-get install haproxy=2.6.*

External-check(Custom check)

  • API 서버에서 서버 상태를 제공받아 해당 상태에 따라 Health check를 해주는 식으로 구현

환경 세팅

  • 보안 강화를 위해 chroot를 설정하여 HAProxy 에서 chroot 내에 있는 파일만 읽을 수 있도록 함
  • /var/lib/haproxy 를 chroot로 설정 (chroot란 감옥(jail) 디렉터리(directory) path 또는 샌드박스 path이며, chroot로 만들어진 격리된 공간)
  • chroot 설정방법
    chr=/var/lib/haproxy
    sudo mkdir -p $chr/{bin,lib,lib64}
    list="$(ldd /bin/bash | egrep -o '/lib.*\.[0-9]')"
    sudo chmod 755 /var/lib/haproxy/lib # 카피 권한을 주기 위해 사용
    sudo chmod 755 /var/lib/haproxy/lib64
    for i in $list; do cp -v --parents "$i" "${chr}"; done
    cp -v /bin/bash $chr
    
  • /var/lib/haproxy/bin 아래에 Shell script 파일 추가

Shell script 파일 작성 방법

  • ex) check_server_status.sh
    #!/bin/bash
    
    status=$(curl -s http://www.api.com/status)
    
    if [[ "$status" == "master" ]]; then
            exit 0
    else
            exit 1
    fi
    
  1. 외부 API로부터 서버의 상태를 받아옴
  2. 서버 상태가 master이면 exit code 0을 리턴
  3. slave 또는 서버 다운으로 인해 blocked 상태이면 exit code 1을 리턴
  4. HAProxy에서 Health check 시 code를 받아와 0이면 check pass, 1이면 check fail
  • 중요: HAProxy 사용자가 스크립트 파일을 실행할 수 있도록 사용 권한을 주어야 함
    sudo chmod +x /var/lib/haproxy/bin/check_server_status.sh # 스크립트 실행 가능하게 함
    sudo chown haproxy:haproxy /var/lib/haproxy/bin/check_server_status.sh # 파일 소유자를 HAProxy 사용자로 변경
    

HAProxy config(/etc/haproxy/haproxy.cfg) 파일 수정

global

  • 로그 파일 위치 또는 허용되는 최대 연결 수와 같은 전체 HAProxy에 적용되는 글로벌 매개변수를 포함
    global
    		log 127.0.0.1   local0
        	log 127.0.0.1   local1 notice
            external-check
            insecure-fork-wanted
            insecure-setuid-wanted
    

default

  • 모든 Frontend 및 Backend 섹션에 적용되는 기본 설정을 포함
  • 연결에 대한 기본 시간 초과 값 또는 모드를 설정할 수 있음
    defaults
            mode    tcp
            timeout connect 4s
            timeout client  15s
            timeout server  15s
            #timeout tunnel 365d
    

frontend

  • HAProxy에서 사용할 IP, Port 설정
  • 수신 트래픽을 처리하는 방법을 지정. ex) 실행할 backend를 연결. 특정 조건에 따라 트래픽을 다른 백엔드 서버로 라우트하도록  정의 가능
    frontend web_frontend
            bind *:5000
            default_backend master_backend # 5000번 포트로 트래픽이 들어오면 이름이 master_backend인 backend를 실행
    
            acl is_master_alive nbsrv(main_backend) gt 0 # master_backend 의 code가 0보다 클때 is_master_alive는 True
            use_backend slave_backend if !is_master_alive # is_master_alive가 False이면 slave_backend를 실행
    

backend

  • 각 서버의 IP, Port 지정
  • 해당 서버에서 수행해야 할 health check를 지정
  • 각 서버에 대한 load balancing 알고리즘과 가중치를 정의할 수 있음
  • master_backend
    backend master_backend
            option external-check
            external-check path "/var/lib/haproxy/bin: /usr/bin:/bin" # 경로 지정
            external-check command /var/lib/haproxy/bin/check_server1_status.sh # 스크립트 파일 실행
            server master_server 127.0.0.1:7000 check inter 1s
    
  • slave_backend
    backend slave_backend
            option external-check
            external-check path "/var/lib/haproxy/bin: /usr/bin:/bin"
            external-check command /var/lib/haproxy/bin/check_server2_status.sh
            server slave_server 127.0.0.1:7001 check inter 1s

listen

  • 지정해준 Port로 웹 콘솔에 진입 가능
    ```
    listen stats
            bind 0.0.0.0:80
            mode http
            balance
            timeout client 5000
            timeout connect 4000
            timeout server 30000
    
            stats uri /haproxy_stats # 127.0.0.1:80/haproxy_stats로 접속 시 status 확인 가능
            stats realm HAProxy\ Statistics
            stats auth username:password # 웹 콘솔에 접근하는 계정/암호 설정
            stats admin if TRUE # 위 auth를 통해 admin쿠키를 설정하여 admin 쿠키를 TRUE로 설정한 client에 대해서만 접근이 가능하도록 함.
    
    ```

실행

  • sudo service haproxy start/stop/restart

Status 확인

0개의 댓글