최대 웹 응용 프로그램 가용성, 확장성 및 고성능을 보장하기 위해 서버 클러스터링 및 부하 분산과 같은 중복성을 도입하는 기술을 구현하는 것이 일반적입니다. 예를 들어, 모두 동일한 응용 프로그램을 실행하는 서버 클러스터를 설정한 다음 그 앞에 부하 분산기를 배치하여 트래픽을 분배합니다.
HAProxy는 매우 높은 트래픽 웹 사이트를 위해 만들어진 고가용성 TCP/HTTP 부하 분산기, 프록시 서버 및 SSL/TLS 종점이며 오픈 소스이면서 강력하고 안정적이며 널리 사용됩니다. Linux, Solaris, FreeBSD, OpenBSD 및 AIX 운영 체제에서 신뢰할 수 있게 실행됩니다.
이 안내서에서는 HAProxy를 사용하여 CentOS 8에 전용 고가용성 부하 분산기를 설정하여 NGINX 웹 서버 클러스터의 트래픽을 제어하는 방법을 보여줍니다. 또한 HAProxy에서 SSL/TLS 종료를 구성하는 방법을 설명합니다.
전제 조건:
A total of 4 servers with minimal CentOS 8 installation.
테스트 환경 설정
----------- HAProxy Server Setup ----------- HA Proxy Server - hostname: haproxy-server.tecmint.lan; IP: 10.42.0.247 Test Site Domain: www.tecmint.lan ----------- Client Web Servers Setup ----------- Web Server #1 - hostname: websrv1.tecmint.lan; IP: 10.42.0.200 Web Server #2 - hostname: websrv2.tecmint.lan; IP: 10.42.0.21 Web Server #3 - hostname: websrv3.tecmint.lan; IP: 10.42.0.34
단계 1: 클라이언트 머신에 Nginx HTTP 서버 설정
1. 모든 CentOS 8 클라이언트 머신에 로그인하고 Nginx 웹 서버를 다음과 같이 dnf 패키지 관리자를 사용하여 설치합니다.
# dnf install Nginx
2. 다음으로, Nginx 서비스를 시작하고, 현재 시스템 부팅시 자동으로 시작하도록 활성화하고, 그 상태를 확인하여 실행 중인지 확인하십시오. 이를 확인하려면 systemctl 명령어를 사용하십시오 (모든 클라이언트 머신에서 수행하십시오).
# systemctl start nginx # systemctl enable nginx # systemctl status nginx
3. 또한, 모든 클라이언트 머신에서 firewalld 서비스가 실행 중인지 확인해야합니다 (systemctl start firewalld를 실행하여 확인할 수 있음). 방화벽 구성에 HTTP 및 HTTPS 서비스를 추가하여 로드 밸런서에서 Nginx 웹 서버로의 요청을 방화벽을 통해 허용하십시오. 그런 다음 새로운 변경 사항을 적용하기 위해 firewalld 서비스를 다시로드하십시오 (모든 클라이언트 머신에서 수행하십시오).
# firewall-cmd --zone=public --permanent --add-service=http # firewall-cmd --zone=public --permanent --add-service=https # firewall-cmd --reload
4. 그런 다음 로컬 머신에서 웹 브라우저를 열고 Nginx 설치가 정상적으로 작동하는지 테스트하십시오. 클라이언트 IP를 사용하여 탐색하고, Nginx 테스트 페이지가 표시되면, 클라이언트 머신에 설치된 웹 서버가 올바르게 작동하는 것입니다.

5. 다음으로, 나중에 HAProxy 설정을 테스트하기 위해 클라이언트 머신에 테스트 페이지를 생성해야합니다.
----------- Web Server #1 ----------- # cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig # echo "Showing site from websrv1.tecmint.lan"> /usr/share/nginx/html/index.html ----------- Web Server #2 ----------- # cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig # echo "Showing site from websrv2.tecmint.lan"> /usr/share/nginx/html/index.html ----------- Web Server #3 ----------- # cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig # echo "Showing site from websrv3.tecmint.lan"> /usr/share/nginx/html/index.html
단계 2: CentOS 8에 HAProxy 서버 설치 및 구성
6.이제 다음 명령을 실행하여 HAProxy 패키지를 HAProxy 서버에 설치하십시오.
# dnf install haproxy
7.다음으로 HAProxy 서비스를 시작하고 시스템 부팅 시 자동으로 시작되도록 설정한 다음 상태를 확인하십시오.
# systemctl start haproxy # systemctl enable haproxy # systemctl status haproxy

8.이제 다음 구성 파일을 사용하여 HAProxy를 구성합니다.
# vi /etc/haproxy/haproxy.cfg
구성 파일은 네 가지 주요 섹션으로 나뉩니다.
- 전역 설정 – 프로세스 전체 매개변수를 설정합니다.
- 기본값 – 이 섹션은 선언된 후에 따르는 모든 다른 섹션에 대한 기본 매개변수를 설정합니다.
- 프론트엔드 – 이 섹션은 클라이언트 연결을 수락하는 수신 소켓 집합을 설명합니다.
- 백엔드 – 이 섹션은 프록시가 들어오는 연결을 전달하기 위해 연결할 서버 집합을 설명합니다.
전역 설정 및 기본값의 옵션을 이해하려면 HAProxy 문서를 참조하십시오(글 끝에 제공된 링크). 이 가이드에서는 기본값을 사용할 것입니다.
HAProxy 로깅 설정
9.한 번 배포된 HAProxy는 IT 인프라에서 중요한 역할을 하므로 이를 위해 로깅을 구성하는 것이 기본 요구 사항입니다. 이를 통해 백엔드 웹 서버로의 각 연결에 대한 통찰을 얻을 수 있습니다.
로그 매개변수 (다음 스크린샷에서 강조된)는 로그 메시지를 수신할 전역 Syslog 서버(CentOS의 기본값인 rsyslog 등)를 선언합니다. 여기에는 하나 이상의 서버를 선언할 수 있습니다.
기본 구성은 localhost (127.0.0.1)을 가리키며, local2는 rsyslog에서 HAProxy 로그 메시지를 식별하는 데 사용되는 기본 시설 코드입니다.

10. 다음으로, rsyslog 서버가 HAProxy 로그 메시지를 수신하고 처리하는 방법을 알려주어야 합니다. rsyslog 구성 파일을 /etc/rsyslog.conf로 열거나 /etc/rsyslog.d 디렉터리 내에 새 파일을 만듭니다. 예를 들어 /etc/rsyslog.d/haproxy.conf로 생성합니다.
# vi /etc/rsyslog.d/haproxy.conf
다음 구성을 복사하여 기본 포트 514에서 UDP를 사용하여 로그를 수집하는 데 사용합니다.
$ModLoad imudp $UDPServerAddress 127.0.0.1 $UDPServerRun 514
또한 다음 라인을 추가하여 rsyslog이 심각도에 따라 두 개의 별도 로그 파일에 기록하도록 지시하며, 여기서 local2는 위에서 HAProxy 구성에서 정의된 시설 코드입니다.
local2.* /var/log/haproxy-traffic.log local2.notice /var/log/haproxy-admin.log
11. 파일을 저장하고 닫습니다. 그런 다음 최근 변경 사항을 적용하기 위해 rsyslog 서비스를 다시 시작합니다.
# systemctl restart rsyslog
HAProxy 프론트엔드 및 백엔드 구성
12. 이 섹션에서는 프론트엔드 및 백엔드 프록시를 구성하는 방법을 보여드리겠습니다. HAProxy 구성 파일로 돌아가서 기본 프론트엔드 및 백엔드 섹션을 다음과 같이 수정하십시오. 각 매개변수에 대한 자세한 설명은 생략하겠습니다. 언제든지 공식 문서를 참조할 수 있습니다.
다음 구성은 listen 섹션을 정의하여 HAProxy Stats 페이지를 제공하는 데 사용됩니다. bind 매개변수는 특정 IP 주소 (*
이 경우 모두에 대해) 및 포트 (9000)에 수신기를 할당합니다.
stats enable 설정은 통계 페이지를 활성화하며 URI /stats를 통해 액세스됩니다 (즉, http://server_ip:9000/stats
).
stats auth 설정은 페이지에 액세스할 때 기본 인증을 추가하는 데 사용됩니다 (haproxy 및 Lostp@1ss를 사용자 이름과 비밀번호로 바꿉니다).
listen stats bind *:9000 stats enable stats hide-version stats uri /stats stats admin if LOCALHOST stats auth haproxy:Lostp@1ss
13. 다음 구성은 TL이라는 프론트엔드 섹션을 정의합니다 (원하는 이름을 지정할 수 있습니다). mode 매개변수는 HAProxy가 작동하는 모드를 정의합니다.
ACL (Access Control List) 매개변수는 요청에서 추출된 내용을 기반으로 결정을 내리는 데 사용됩니다. 이 예에서 요청이 SSL을 통해 이루어지지 않았다면 요청은 일반 HTTP로 간주됩니다.
그런 다음 http-request set-header 설정을 사용하여 요청에 HTTP 헤더를 추가합니다. 이는 Nginx에게 초기 요청이 HTTP (또는 포트 80을 통해) 이루어졌음을 알려줍니다.
default_backend 또는 use_backend 지시문은 백엔드 서버를 정의하며, 이 경우 TL_web_servers에 의해 참조됩니다.
HAProxy는 use_backend 또는 default_backend 지시문에 의해 경로 지정되지 않은 요청에 대해 “503 Service Unavailable error”를 반환할 것임을 유의하십시오.
frontend TL bind *:80 mode http acl http ssl_fc,not http-request set-header X-Forwarded-Protocol http if http default_backend TL_web_servers
14. 그런 다음 balance 설정이 백엔드 서버를 선택하는 방법을 정의하는 백엔드 섹션을 정의해야 합니다. 이 설정은 어떤 지속성 방법도 해당 선택을 무시하지 않는 한 HAProxy가 요청을 처리할 백엔드 서버를 선택하는 방법을 정의합니다.
cookie 지시문은 쿠키 기반 지속성을 활성화하며, 이는 HAProxy에게 클라이언트에게 SERVERID라는 이름의 쿠키를 보내고 초기 응답을 제공한 서버의 ID와 연결하도록 지시합니다.
서버 지시문은 서버_이름 형식으로 업스트림 서버를 정의하는 데 사용됩니다 (예: websrv1), 서버_IP:포트 및 옵션.
중요한 옵션 중 하나는 check으로, HAProxy에 서버의 가용성을 계속 확인하도록 지시하고 통계 페이지에 보고합니다.
backend TL_web_servers mode http balance roundrobin option httpchk HEAD / cookie SERVERUID insert indirect nocache server websrv1 10.42.0.200:80 cookie websrv1 check server websrv2 10.42.0.21:80 cookie websrv2 check server websrv3 10.42.0.34:80 cookie websrv3 check
스크린샷에 표시된대로 다른 frontend 및 backend 섹션을 주석 처리하십시오. 파일을 저장하고 닫으십시오.

15. 이제 새 변경 사항을 적용하려면 HAProxy 서비스를 다시 시작하십시오.
# systemctl restart haproxy
16. 다음으로, 클라이언트 요청을 수락하기 위해 방화벽에서 HTTP (포트 80) 및 HTTPS (포트 433) 서비스가 열려 있는지 확인하십시오. 또한 통계 페이지에 액세스하기 위해 방화벽에서 포트 9000을 열고 방화벽 설정을 다시로드하십시오.
# firewall-cmd --zone=public --permanent --add-service=http # firewall-cmd --zone=public --permanent –add-service=https # firewall-cmd --zone=public --permanent --add-port=9000/tcp # firewall-cmd --reload
단계 3: HAProxy 설정 테스트 및 통계 보기
17. 이제 HAPrxoy 설정을 테스트하는 시간입니다. 모든 서버에 액세스하는 로컬 데스크톱 컴퓨터에서 더미 사이트 도메인을 사용할 수 있도록 /etc/hosts 파일에 다음 줄을 추가하십시오.
10.42.0.247 www.tecmint.lan
18. 그런 다음 브라우저를 열고 서버 주소 또는 사이트 도메인을 사용하여 탐색하십시오.
http://10.42.0.247/ OR http://www.tecmint.lan/

19. HAProxy 통계 페이지에 액세스하려면 다음 주소를 사용하십시오.
http://10.42.0.247:9000/stats
그런 다음 HAProxy 구성 파일에서 정의한 사용자 이름과 암호를 사용하십시오 (stats auth 매개변수 참조).

로그인에 성공한 후에는 HAProxy 통계 페이지로 이동하게 됩니다. 이 페이지에서는 서버의 상태, 현재 요청률, 응답 시간 등을 포함한 메트릭을 표시합니다.
상태 보고서가 색상 코드 작동을 보여주기 위해 백엔드 서버 중 하나를 설정했습니다.

단계 4: 자체 서명 SSL 인증서를 사용하여 HAProxy에서 HTTPS 구성
20. 이 마지막 섹션에서는 HAProxy 서버와 클라이언트 간의 모든 통신을 보안하는 방법을 설명하겠습니다. HAProxy는 네 가지 주요 HTTPS 구성 모드를 지원하지만, 이 가이드에서는 SSL/TLS 오프로딩을 사용할 것입니다.
SSL/TLS 오프로딩 모드에서 HAProxy는 클라이언트 측에서 트래픽을 해독하고 백엔드 서버로는 암호화되지 않은 트래픽으로 연결됩니다.
먼저 화면에 표시된 대로 회사 세부 정보에 따라 인증서 및 키를 생성합니다(인증서 생성 중 회사 세부 정보에 따라 해당 질문에 대답하십시오).
# mkdir /etc/ssl/tecmint.lan # cd /etc/ssl/tecmint.lan/ # openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/tecmint.lan.key -out /etc/ssl/tecmint.lan.crt # cd /etc/ssl/tecmint.lan/ # cat tecmint.crt tecmint.key >tecmint.pem # ls -l

21. 다음으로 HAProxy 구성 파일(/etc/haproxy/haproxy.cfg)을 열고 프론트엔드 섹션을 편집합니다.
frontend TL bind *:80 bind *:443 ssl crt /etc/ssl/tecmint.lan/tecmint.pem redirect scheme https if !{ ssl_fc } mode http acl http ssl_fc,not acl https ssl_fc http-request set-header X-Forwarded-Protocol http if http http-request set-header X-Forwarded-Protocol https if https default_backend TL_web_servers

파일을 저장하고 닫습니다.
22. 그런 다음 새 변경 사항을 적용하기 위해 HAProxy 서비스를 다시 시작합니다.
# systemctl restart haproxy.service
23. 다음으로 웹 브라우저를 열고 사이트에 다시 액세스하십시오. 자체 서명된 인증서 때문에 브라우저에서 오류가 표시됩니다. 고급을 클릭하여 계속 진행합니다.



그것이 지금까지입니다! 모든 웹 애플리케이션에는 고유한 요구 사항이 있습니다. IT 인프라 및 애플리케이션 요구 사항에 맞게 로드 밸런싱을 설계하고 구성해야 합니다.
이 안내서에서 사용된 일부 구성 옵션에 대한 자세한 정보 및 일반적으로 HAProxy를 사용하는 방법은 공식 HAProxy 커뮤니티 에디션 문서 또는 HAProxy 엔터프라이즈 버전 문서를 참조하십시오. 아래의 피드백 양식을 통해 질문이나 생각을 게시할 수 있습니다.
Source:
https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/