하나의 센트OS 8에서 Nginx의 부하 분산을 위해 HAProxy를 설정하는 방법

최대 웹 응용 프로그램 가용성, 확장성 및 고성능을 보장하기 위해 서버 클러스터링 및 부하 분산과 같은 중복성을 도입하는 기술을 구현하는 것이 일반적입니다. 예를 들어, 모두 동일한 응용 프로그램을 실행하는 서버 클러스터를 설정한 다음 그 앞에 부하 분산기를 배치하여 트래픽을 분배합니다.

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를 실행하여 확인할 수 있음). 방화벽 구성에 HTTPHTTPS 서비스를 추가하여 로드 밸런서에서 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 테스트 페이지가 표시되면, 클라이언트 머신에 설치된 웹 서버가 올바르게 작동하는 것입니다.

Test Nginx Installation on All CentOS 8 Client Machines

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
Verify HAProxy Status in CentOS 8

8.이제 다음 구성 파일을 사용하여 HAProxy를 구성합니다.

# vi /etc/haproxy/haproxy.cfg

구성 파일은 네 가지 주요 섹션으로 나뉩니다.

  • 전역 설정 – 프로세스 전체 매개변수를 설정합니다.
  • 기본값 – 이 섹션은 선언된 후에 따르는 모든 다른 섹션에 대한 기본 매개변수를 설정합니다.
  • 프론트엔드 – 이 섹션은 클라이언트 연결을 수락하는 수신 소켓 집합을 설명합니다.
  • 백엔드 – 이 섹션은 프록시가 들어오는 연결을 전달하기 위해 연결할 서버 집합을 설명합니다.

전역 설정기본값의 옵션을 이해하려면 HAProxy 문서를 참조하십시오(글 끝에 제공된 링크). 이 가이드에서는 기본값을 사용할 것입니다.

HAProxy 로깅 설정

9.한 번 배포된 HAProxy는 IT 인프라에서 중요한 역할을 하므로 이를 위해 로깅을 구성하는 것이 기본 요구 사항입니다. 이를 통해 백엔드 웹 서버로의 각 연결에 대한 통찰을 얻을 수 있습니다.

로그 매개변수 (다음 스크린샷에서 강조된)는 로그 메시지를 수신할 전역 Syslog 서버(CentOS의 기본값인 rsyslog 등)를 선언합니다. 여기에는 하나 이상의 서버를 선언할 수 있습니다.

기본 구성은 localhost (127.0.0.1)을 가리키며, local2rsyslog에서 HAProxy 로그 메시지를 식별하는 데 사용되는 기본 시설 코드입니다.

HAProxy Default Log Parameter

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 설정은 페이지에 액세스할 때 기본 인증을 추가하는 데 사용됩니다 (haproxyLostp@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에 의해 참조됩니다.

HAProxyuse_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 섹션을 주석 처리하십시오. 파일을 저장하고 닫으십시오.

Configuring HAProxy Front-end and Back-ends

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/
Check HAProxy Setup

19. HAProxy 통계 페이지에 액세스하려면 다음 주소를 사용하십시오.

http://10.42.0.247:9000/stats

그런 다음 HAProxy 구성 파일에서 정의한 사용자 이름과 암호를 사용하십시오 (stats auth 매개변수 참조).

HAProxy Stats Login Page

로그인에 성공한 후에는 HAProxy 통계 페이지로 이동하게 됩니다. 이 페이지에서는 서버의 상태, 현재 요청률, 응답 시간 등을 포함한 메트릭을 표시합니다.

상태 보고서가 색상 코드 작동을 보여주기 위해 백엔드 서버 중 하나를 설정했습니다.

HAProxy Statistics Report

단계 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
Create SSL for HAProxy

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
Configure HAProxy Front-end with SSL

파일을 저장하고 닫습니다.

22. 그런 다음 새 변경 사항을 적용하기 위해 HAProxy 서비스를 다시 시작합니다.

# systemctl restart haproxy.service

23. 다음으로 웹 브라우저를 열고 사이트에 다시 액세스하십시오. 자체 서명된 인증서 때문에 브라우저에서 오류가 표시됩니다. 고급을 클릭하여 계속 진행합니다.

HAProxy SSL Connection Error
Proceed with Connection
Access Site Over HTTPS

그것이 지금까지입니다! 모든 웹 애플리케이션에는 고유한 요구 사항이 있습니다. IT 인프라 및 애플리케이션 요구 사항에 맞게 로드 밸런싱을 설계하고 구성해야 합니다.

이 안내서에서 사용된 일부 구성 옵션에 대한 자세한 정보 및 일반적으로 HAProxy를 사용하는 방법은 공식 HAProxy 커뮤니티 에디션 문서 또는 HAProxy 엔터프라이즈 버전 문서를 참조하십시오. 아래의 피드백 양식을 통해 질문이나 생각을 게시할 수 있습니다.

Source:
https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/