HAProxy LTS 버전 Package 설치 및 리버스 프록시 구현

HAProxy 는 고성능의 TCP/HTTP 로드 밸런서이자 리버스 프록시 서버입니다. 주로 웹 서버의 부하를 분산시키기 위해 사용됩니다.

이 블로그 포스트에서는 다양한 리눅스 배포판(Ubuntu, Debian, RHEL, AlmaLinux, Oracle Linux, Rocky Linux, SUSE)에서 저장소 패키지를 통해 HAProxy를 설치하고 리버스 프록시 로 구성하는 방법을 단계별로 안내합니다.

목차

1. 하드웨어 전제조건
 1-1. 낮은 수준의 Workload
 1-2. 중간 수준의 Workload
 1-3. 높은 수준의 Workload
2. 운영체제별 HAProxy 설치 방법
 2-1. AlmaLinux 8, 9에서 HAProxy 설치
 2-2. Debian 11, 12에서 HAProxy 설치
 2-3. Oracle Linux 8, 9에서 HAProxy 설치
 2-4. RHEL 8, 9에서 HAProxy 설치
 2-5. Rocky Linux 8, 9에서 HAProxy 설치
 2-6. SUSE 15.5에서 HAProxy 설치
 2-7. Ubuntu 20.04, 22.04, 24.04에서 HAProxy 설치
3. HAProxy 를 통한 리버스 프록시 구성
4. 결론

1. 하드웨어 전제조건

HAProxy 의 하드웨어 요구 사항은 관리해야 하는 워크로드에 따라 다릅니다.

해당 포스트에서는 CPU와 메모리만 고려하여 설명합니다. 디스크 크기는 운영 체제와 보관하려는 로그의 양에 따라 달라집니다. 아래 표시는 정보 제공을 위한 것입니다.
서버 크기 조정에 대한 도움이 필요하면 NGINX STORE에 문의하세요.

1-1. 낮은 수준의 Workload

  • TCP 또는 HTTP 트래픽
  • 최대 1000con/s
  • 매우 낮은 SSL 트래픽 또는 gzip 압축

이 유형의 작업량은 가상 머신 또는 베어 메탈 서버로 처리할 수 있습니다. 최소 요구 사항은 다음과 같습니다.

  • 1개의 CPU 코어
  • 1GB의 RAM

1-2. 중간 수준의 Workload

  • TCP 또는 HTTP 트래픽
  • 최대 4000 conn/s
  • 낮은 SSL 트래픽 또는 gzip 압축

이 유형의 작업량은 가상 머신 또는 베어 메탈 서버로 처리할 수 있습니다. 최소 요구 사항은 다음과 같습니다.

  • 2개의 CPU 코어
  • 1GB의 RAM

1-3. 높은 수준의 Workload

  • TCP 또는 HTTP 트래픽
  • 최대 20000 conn/s
  • 10%의 트래픽이 암호화(SSL)되거나 압축됨

이 유형의 작업량은 베어 메탈 서버로만 처리할 수 있습니다. 최소 요구 사항은 다음과 같습니다.

  • 가능한 한 빠른 2개의 CPU 코어
  • 4GB의 RAM
  • 강력한 네트워크 카드

2. 운영체제별 HAProxy 설치 방법

2-1. AlmaLinux 8, 9에서 HAProxy 설치

1. EPEL 저장소를 설치합니다.

sudo dnf install epel-release -y

2. AlmaLinux의 기본 저장소에 HAProxy 3.0이 없기 때문에 소스를 직접 빌드하여 설치합니다.

sudo dnf install -y gcc pcre-devel tar make
wget http://www.haproxy.org/download/3.0/src/haproxy-3.0.3.tar.gz
tar -zxvf haproxy-3.0.3.tar.gz
cd haproxy-3.0.3
make TARGET=linux-glibc
sudo make install

3. HAProxy를 설정하고 시작합니다.

sudo cp haproxy /usr/local/sbin/
sudo mkdir -p /etc/haproxy
sudo cp examples/haproxy.cfg /etc/haproxy/haproxy.cfg
sudo /usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg

2-2. Debian 11, 12에서 HAProxy 설치

1. APT 저장소를 업데이트 합니다.

sudo apt update
sudo apt upgrade -y

2. HAProxy PPA (Personal Package Archive)를 추가합니다.

sudo add-apt-repository ppa:vbernat/haproxy-3.0
sudo apt update

3. HAProxy 3.0.3 버전을 설치합니다.

sudo apt install haproxy=3.0.3-1ppa1~$(lsb_release -cs)1

4. HAProxy 서비스를 시작합니다.

sudo systemctl start haproxy
sudo systemctl enable haproxy
sudo systemctl status haproxy

2-3. Oracle Linux 8, 9에서 HAProxy 설치

1. EPEL 저장소를 설치합니다.

sudo dnf install epel-release -y

2. Oracle Linux의 기본 저장소에 최신 HAProxy가 없기 때문에 소스를 직접 빌드하여 설치합니다.

sudo dnf install -y gcc pcre-devel tar make
wget http://www.haproxy.org/download/3.0/src/haproxy-3.0.3.tar.gz
tar -zxvf haproxy-3.0.3.tar.gz
cd haproxy-3.0.3
make TARGET=linux-glibc
sudo make install

3. HAProxy를 설정하고 시작합니다.

sudo cp haproxy /usr/local/sbin/
sudo mkdir -p /etc/haproxy
sudo cp examples/haproxy.cfg /etc/haproxy/haproxy.cfg
sudo /usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg

2-4. RHEL 8, 9에서 HAProxy 설치

1. EPEL 저장소 설치합니다.

sudo dnf install epel-release -y 

2. RHEL의 기본 저장소에 최신 HAProxy가 없기 때문에 소스를 직접 빌드하여 설치합니다.

sudo dnf install -y gcc pcre-devel tar make
wget http://www.haproxy.org/download/3.0/src/haproxy-3.0.3.tar.gz
tar -zxvf haproxy-3.0.3.tar.gz
cd haproxy-3.0.3
make TARGET=linux-glibc
sudo make install

3. HAProxy를 설정하고 및 시작합니다.

sudo cp haproxy /usr/local/sbin/
sudo mkdir -p /etc/haproxy
sudo cp examples/haproxy.cfg /etc/haproxy/haproxy.cfg
sudo /usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg

2-5. Rocky Linux 8, 9에서 HAProxy 설치

1. EPEL 저장소를 설치합니다.

sudo dnf install epel-release -y

2. Rocky Linux의 기본 저장소에 최신 HAProxy가 없기 때문에 소스를 직접 빌드하여 설치합니다.

sudo dnf install -y gcc pcre-devel tar make
wget http://www.haproxy.org/download/3.0/src/haproxy-3.0.3.tar.gz
tar -zxvf haproxy-3.0.3.tar.gz
cd haproxy-3.0.3
make TARGET=linux-glibc
sudo make install

3. HAProxy를 설정하고 시작합니다.

sudo cp haproxy /usr/local/sbin/
sudo mkdir -p /etc/haproxy
sudo cp examples/haproxy.cfg /etc/haproxy/haproxy.cfg
sudo /usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg

2-6. SUSE 15.5에서 HAProxy 설치

1. zypper 저장소를 업데이트합니다.

sudo zypper update -y

2. SUSE에서 최신 HAProxy를 설치하기 위해 소스를 직접 빌드합니다.

sudo zypper install -y gcc pcre-devel make
wget http://www.haproxy.org/download/3.0/src/haproxy-3.0.3.tar.gz
tar -zxvf haproxy-3.0.3.tar.gz
cd haproxy-3.0.3
make TARGET=linux-glibc
sudo make install

3. 설치한 HAProxy의 기본 설정을 한 뒤 실행합니다.

sudo cp haproxy /usr/local/sbin/
sudo mkdir -p /etc/haproxy
sudo cp examples/haproxy.cfg /etc/haproxy/haproxy.cfg
sudo /usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg

2-7. Ubuntu 20.04, 22.04, 24.04에서 HAProxy 설치

1. APT 저장소를 업데이트 합니다.

sudo apt update
sudo apt upgrade -y

2. HAProxy PPA (Personal Package Archive)를 추가합니다.

sudo add-apt-repository ppa:vbernat/haproxy-3.0
sudo apt update

3. 최신 HAProxy인 3.0.3 버전을 설치합니다.

sudo apt install haproxy=3.0.3-1ppa1~$(lsb_release -cs)1

4. 서비스를 시작합니다.

sudo systemctl start haproxy
sudo systemctl enable haproxy
sudo systemctl status haproxy

3. HAProxy 를 통한 리버스 프록시 구성

HAProxy가 설치되었다면, HAProxy를 리버스 프록시로 만들기 위해 구성파일을 수정합니다.

구성파일의 위치는 다음과 같습니다.

cat -n /etc/haproxy/haproxy.cfg                                                                                                                                                                              

     1  global
     2          log /dev/log    local0
     3          log /dev/log    local1 notice
     4          chroot /var/lib/haproxy
     5          stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
     6          stats timeout 30s
     7          user haproxy
     8          group haproxy
     9          daemon
    10
    11  defaults
    12          log     global
    13          mode    http
    14          option  httplog
    15          option  dontlognull
    16          timeout connect 5000
    17          timeout client  50000
    18          timeout server  50000
    19          errorfile 400 /etc/haproxy/errors/400.http
    20          errorfile 403 /etc/haproxy/errors/403.http
    21          errorfile 408 /etc/haproxy/errors/408.http
    22          errorfile 500 /etc/haproxy/errors/500.http
    23          errorfile 502 /etc/haproxy/errors/502.http
    24          errorfile 503 /etc/haproxy/errors/503.http
    25          errorfile 504 /etc/haproxy/errors/504.http
    26
    27  frontend http_front
    28          bind *:9000
    29          default_backend http_back
    30
    31  backend http_back
    32          balance roundrobin
    33          option httpchk
    34          http-check send meth HEAD uri / ver HTTP/1.1 hdr Host localhost
    35          server server1 192.168.200.100:8181 check # 실제 Backend IP를 입력하세요.
    36
    37  listen stats
    38          bind :9091
    39          stats enable
    40          stats uri /stats
    41          stats refresh 10s
    42          stats auth admin:password
 

아래는 섹션 별 라인에 대한 설명입니다.

global 섹션

log /dev/log local0

  • 로그를 /dev/log로 보내고, local0 로컬 로깅 시설을 사용합니다. Syslog 서버에 로그를 전송하는 데 사용됩니다.

log /dev/log local1 notice

  • 로그를 /dev/log로 보내며, local1 로컬 로깅 시설을 사용하고, 로그 수준을 notice로 설정합니다.

chroot /var/lib/haproxy

  • 보안을 강화하기 위해 HAProxy 프로세스를 /var/lib/haproxy 디렉토리로 chroot합니다. 이 설정은 HAProxy가 해당 디렉토리 밖의 파일에 접근하지 못하게 합니다.

stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners

  • /run/haproxy/admin.sock 경로에 Unix 도메인 소켓을 생성합니다. mode 660은 소켓 파일의 권한을 설정하고, level admin은 관리 명령에 대한 접근을 허용합니다. expose-fd listeners는 리스너 파일 디스크립터를 노출하여 리스너를 재구성할 때 사용됩니다.

stats timeout 30s

  • 통계 소켓의 타임아웃 시간을 30초로 설정합니다.

user haproxy

  • HAProxy 프로세스를 실행할 사용자 계정을 haproxy로 설정합니다.

group haproxy

  • HAProxy 프로세스를 실행할 그룹을 haproxy로 설정합니다.

daemon

HAProxy를 데몬으로 실행하여 백그라운드에서 작동하도록 합니다.

defaults 섹션

log global

  • 글로벌 로그 설정을 따릅니다. 즉, global 섹션에서 정의한 로그 설정을 사용합니다.

mode http

  • HAProxy를 HTTP 모드로 설정합니다. 이는 TCP 모드와 달리 HTTP 프로토콜에 특화된 설정을 의미합니다.

option httplog

  • HTTP 로그 형식을 사용하여 요청 로그를 기록합니다.

option dontlognull

  • 빈 요청(null request)에 대한 로그를 기록하지 않습니다.

timeout connect 5000

  • 서버 연결 타임아웃 시간을 5000ms(5초)로 설정합니다.

timeout client 50000

  • 클라이언트 응답 타임아웃 시간을 50000ms(50초)로 설정합니다.

timeout server 50000

  • 서버 응답 타임아웃 시간을 50000ms(50초)로 설정합니다.

errorfile ~ /etc/haproxy/errors/~.http

  • HTTP 에러코드 발생 시 표시할 HTML 파일 경로를 설정합니다.
frontend 섹션

frontend http_front

  • http_front라는 이름의 프론트엔드 설정을 시작합니다. 이는 클라이언트로부터 들어오는 요청을 처리합니다.

bind :9000

  • HAProxy가 모든 네트워크 인터페이스에서 9000번 포트로 들어오는 요청을 수신하도록 설정합니다.

default_backend http_back

기본 백엔드를 http_back으로 설정합니다. 이는 프론트엔드에서 수신된 모든 요청을 이 백엔드로 전달합니다.

backend 섹션

backend http_back

  • http_back라는 이름의 백엔드 설정을 시작합니다. 이는 프론트엔드에서 전달된 요청을 처리하는 서버들을 정의합니다.

balance roundrobin

  • 로드 밸런싱 알고리즘을 라운드로빈 방식으로 설정합니다. 이는 각 서버에 순차적으로 요청을 분배합니다.

option httpchk

  • 백엔드 섹션에서 HTTP 상태 체크를 활성화합니다.

http-check send meth HEAD uri / ver HTTP/1.1 hdr Host localhost

  • HTTP 상태 체크를 수행하기 위해 HTTP HEAD 메소드를 사용하여 요청을 보냅니다. 이 요청은 Host 헤더가 localhost로 설정됩니다.

server server1 <Enter-Your-Backend-Server>:<Port> check

server1이라는 이름의 백엔드 서버를 정의합니다. <Enter-Your-Backend-Server> 부분을 실제 백엔드 서버의 주소와 포트로 대체해야 합니다. check 옵션은 이 서버의 상태를 주기적으로 확인합니다.

listen 섹션

listen stats

  • stats라는 이름의 리슨 설정을 시작합니다. 이는 HAProxy의 통계 페이지를 설정합니다.

bind :9091

  • 모든 네트워크 인터페이스에서 9091번 포트로 들어오는 요청을 수신하도록 설정합니다.

stats enable

  • 통계 페이지 기능을 활성화합니다.

stats uri /stats

  • 통계 페이지에 접근할 URI를 /stats로 설정합니다.

stats refresh 10s

  • 통계 페이지를 10초마다 자동으로 새로고침하도록 설정합니다.

stats auth admin

통계 페이지 접근 시 인증을 요구하며, 사용자 이름은 admin, 비밀번호는 password로 설정합니다.

이 구성을 통해 HAProxy는 HTTP 요청을 로드 밸런싱하고 Health Check를 수행하며, 통계 페이지를 통해 실시간으로 Status를 모니터링할 수 있습니다.

해당 구성 파일을 작성하고 구성 파일 점검 명령어를 통해 구성에 문제가 없는지 확인할 수 있습니다.

haproxy -c -f /etc/haproxy/haproxy.cfg

systmectl restart haproxy 명령어를 통해 HAProxy를 재기동하여 리버스 프록시 구성을 적용합니다.

systmectl restart haproxysystemctl status haproxy

                                                                                                                                                                                       
● haproxy.service - HAProxy Load Balancer
     Loaded: loaded (/lib/systemd/system/haproxy.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2024-07-23 15:18:00 KST; 1h 42min ago

cURL 요청을 통해 Reverse Proxy 적용을 확인합니다.

curl localhost:9000
{"server":{"address":"172.17.0.6","port":"80","uri":"/", "version":"v1"}}

backend 섹션에 명시되어 있는 서버의 로그를 확인하여 리버스 프록시를 경유하지 않은 요청과 경유한 요청을 비교하여 Source IP를 확인합니다.

  • 192.168.200.72 – Client IP
  • 175.196.233.101 – HAProxy Server IP
  • 192.168.200.100 – Backend Server IP

Backend IP 직접 요청

curl 192.168.200.100:8181

{"server":{"address":"172.17.0.6","port":"80","uri":"/", "version":"v1"}}

Backend Server Log

192.168.200.72 - - [24/Jul/2024:08:34:42 +0000] "GET / HTTP/1.1" 200 74 "-" "curl/7.68.0" "-" # Client IP 노출

HAProxy Proxy IP를 통한 요청

curl 175.196.233.101:9000

{"server":{"address":"172.17.0.6","port":"80","uri":"/", "version":"v1"}}

Backend Server Log

175.196.233.101 - - [24/Jul/2024:08:34:42 +0000] "GET / HTTP/1.1" 200 74 "-" "curl/7.68.0" "-" # Client IP가 가려지고 HAProxy Server IP가 로그에 남음

4. 결론

HAProxy는 대규모 웹사이트와 애플리케이션을 지원하는 데 매우 유용한 도구입니다. 해당 포스트를 통해 HAProxy의 설치와 설정 과정을 이해하고, 다양한 환경에서 이를 적용할 수 있는 방법을 배우셨기를 바랍니다.
더 나아가, HAProxy의 강력한 기능을 활용하여 웹 트래픽 관리와 로드 밸런싱을 최적화할 수 있을 것입니다.

더 자세한 정보는 NGINX STORE의 HAProxy 블로그 카테고리를 참고하거나, NGINX STORE를 통해 문의해보세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required