HAProxy는 "고가용성 프록시"의 약어입니다. 이 프록시는 어떤 TCP 애플리케이션(예: 웹 서버) 앞에 위치할 수 있지만, 주로 여러 웹사이트 인스턴스 사이의 로드 밸런서로 사용됩니다.
이를 수행하는 이유는 여러 가지가 있을 수 있습니다. 웹 사이트에 높은 트래픽이 발생하는 경우, 동일한 웹 사이트 인스턴스를 추가하고 HAProxy를 두 인스턴스 앞에 놓음으로써 트래픽을 분산할 수 있습니다. 다른 이유로는 웹 사이트의 콘텐츠를 다운 타임 없이 업데이트할 수 있도록 하는 것입니다. HAProxy는 DOS 및 DDOS 공격을 완화하는 데에도 도움이 될 수 있습니다.
이 가이드에서는 두 개의 웹사이트 인스턴스를 사용하여 HAProxy를 사용하는 방법과 라운드 로빈 방식의 로드 밸런싱을 동일한 LXD 호스트에서 수행합니다. 이것은 업데이트를 다운 타임 없이 수행하기 위한 완벽한 솔루션일 수 있습니다.
그러나 웹사이트 성능에 문제가 있는 경우, 여러 사이트를 실제 물리적 서버 또는 여러 LXD 호스트 간에 분산하는 것이 필요할 수 있습니다. 물론 LXD를 전혀 사용하지 않고 바로 물리적 서버에서 모든 작업을 수행하는 것도 가능하지만, LXD는 유연성과 성능면에서 우수하며, 실습 테스트에도 좋습니다.
LXD에 대한 지식. 추가 정보는 LXD 서버 문서를 참조하면 됩니다. 완전한 서버 설치를 하지 않고도 노트북이나 워크스테이션에 LXD를 설치하는 것도 완전히 괜찮습니다. 이 문서는 LXD를 사용하는 랩 머신에 작성되었습니다. 하지만 위에 링크된 문서처럼 완전한 서버로 설정되지는 않았습니다.
웹 서버 설치, 구성 및 사용에 대한 지식
이 문서에서는 LXD 호스트가 이미 설치되어 컨테이너를 만들 준비가 되어 있다고 가정합니다.
이 가이드에서는 세 개의 컨테이너가 필요합니다. 물론 원한다면 더 많은 웹 서버 컨테이너를 사용할 수도 있습니다. web1 및 web2를 웹사이트 컨테이너로, 그리고 proxyha를 HAProxy 컨테이너로 사용할 것입니다. 이를 LXD 호스트에서 설치하려면 다음 명령을 사용하세요:
httpd를 활성화하고 시작한 이후에, 환영 화면을 수정해봅시다. 이는 웹사이트가 구성되지 않은 경우에 나타나는 화면, 즉 기본 페이지를 의미합니다. Rocky Linux에서 이 페이지는 /usr/share/httpd/noindex/index.html 위치에 있습니다. 다시 말하지만 컨테이너에 직접 액세스할 필요가 없습니다. 다음과 같이 수행하세요:
lxc exec web1 vi /usr/share/httpd/noindex/index.html
그런 다음 <h1> 태그를 검색하면 다음과 같이 표시됩니다.
<h1>HTTP Server <strong>Test Page</strong></h1>
그냥 이 줄을 다음과 같이 변경하세요:
<h1>SITE1 HTTP Server <strong>Test Page</strong></h1>
이제 web2에 대해 동일한 작업을 반복하세요. 브라우저에서 IP로 이 머신들에 접속하면 각각 올바른 환영 페이지가 반환됩니다. 웹 서버에서 해야 할 작업이 더 많지만, 웹 서버는 두고 프록시 서버로 이동합니다.
이미 프록시 컨테이너에 HAProxy를 설치했지만, 아직 구성을 하지 않았습니다. 아무 것도 하기 전에 호스트를 해결하기 위해 무언가를 수행해야 합니다. 일반적으로는 완전히 정규화된 도메인 이름을 사용하지만, 이 랩 환경에서는 IP를 사용하고 있습니다. proxyha 컨테이너에 몇 개의 호스트 파일 레코드를 추가하여 머신과 연관된 일부 이름을 추가하겠습니다.
위에서 무슨 일이 일어나는지 간단히 설명해드리겠습니다. 테스트하는 동안 이해하게 될 것입니다. 이 가이드의 테스트 섹션으로 이동하면 다음과 같이 확인할 수 있습니다.
site1과 site2가 "acl" 섹션에서 정의되어 있습니다. 그런 다음 각 웹 서버의 "roundrobin"에 site1과 site2가 서로 포함됩니다. 테스트에서 site1.testdomain.com로 이동하는 경우 URL은 변경되지 않지만 페이지 내부는 site1에서 site2 테스트 페이지로 전환됩니다. site2.testdomain.com도 마찬가지로 작동합니다.
이렇게 하면 전환이 발생하는 것을 보여주기 위한 것이지만, 실제로는 어떤 서버를 타겟으로 하더라도 웹사이트 내용은 동일합니다. 여러 호스트 사이에서 트래픽을 분산시키는 방법을 보여주기 위해 이렇게 하는 것입니다. "leastcon"을 balance 라인에 사용하여 이전 히트에 따라 전환하는 대신 연결 수가 가장 적은 사이트를 로드할 수도 있습니다.
일부 HAProxy 버전에는 표준 웹 에러 파일 세트가 포함되어 있지만 Rocky Linux (및 상위 업스트림 공급업체)에서 제공되는 버전에는 이러한 파일이 없습니다. 문제를 해결하는 데 도움이 될 수 있으므로 이 파일을 만들어보는 것이 좋습니다. 이 파일은 존재하지 않는 /etc/haproxy/errors 디렉터리에 위치해야 합니다.
가장 먼저 해야 할 일은 해당 디렉토리를 만드는 것입니다.
lxc exec proxyha mkdir /etc/haproxy/errors
그런 다음 해당 디렉터리에 각 파일을 생성해야 합니다. 파일 이름은 각각 filename.http를 사용하여 LXD 호스트에서 lxc exec proxyha vi /etc/haproxy/errors/filename.http 명령으로 생성할 수 있습니다. 운영 환경에서는 회사별로 사용하고 싶은 더 구체적인 에러 파일이 있을 수 있습니다:
파일 이름 400.http:
HTTP/1.0 400 Bad request
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html><body><h1>400 Bad request</h1>
Your browser sent an invalid request.
</body></html>
파일 이름 403.http:
HTTP/1.0 403 Forbidden
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html><body><h1>403 Forbidden</h1>
Request forbidden by administrative rules.
</body></html>
파일 이름 408.http:
HTTP/1.0 408 Request Time-out
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html><body><h1>408 Request Time-out</h1>
Your browser didn't send a complete request in time.
</body></html>
파일 이름 500.http:
HTTP/1.0 500 Internal Server Error
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html><body><h1>500 Internal Server Error</h1>
An internal server error occurred.
</body></html>
파일 이름 502.http:
HTTP/1.0 502 Bad Gateway
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html><body><h1>502 Bad Gateway</h1>
The server returned an invalid or incomplete response.
</body></html>
파일 이름 503.http:
HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html><body><h1>503 Service Unavailable</h1>
No server is available to handle this request.
</body></html>
파일 이름 504.http:
HTTP/1.0 504 Gateway Time-out
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html><body><h1>504 Gateway Time-out</h1>
The server didn't respond in time.
</body></html>
/etc/hosts 파일을 수정하여 우리의 프록시 컨테이너인 proxyha가 웹 서버를 해석할 수 있도록 설정한 것처럼, 랩 환경에서 로컬 DNS 서버가 없기 때문에 로컬 머신에서도 site1과 site2 웹 사이트에 대한 IP 값을 haproxy 컨테이너와 일치시켜야 합니다. 이러한 도메인 해석 방법을 "집착스러운 사람의 DNS"라고 생각하면 됩니다.
지금 로컬 컴퓨터에서 site1 또는 site2를 ping하면 proxyha에서 응답을 받아야 합니다.
PING site1.testdomain.com (192.168.1.149) 56(84) bytes of data.
64 bytes from site1.testdomain.com (192.168.1.149): icmp_seq=1 ttl=64 time=0.427 ms
64 bytes from site1.testdomain.com (192.168.1.149): icmp_seq=2 ttl=64 time=0.430 ms
웹 브라우저를 열고 주소 창에 site1.testdomain.com (또는 site2.testdomain.com)을 입력하면 두 개의 테스트 페이지 중 하나로부터 응답을 받아야 합니다. 페이지를 다시 로드하면 다음 서버의 테스트 페이지를 얻게 될 것입니다. URL은 변경되지 않지만 반환되는 페이지는 서버간에 번갈아 변경됩니다.