웹사이트 검색

Ubuntu 14.04에서 HAProxy로 SSL 종료를 구현하는 방법


소개

HAProxy는 High Availability Proxy의 약자로 Linux, Solaris 및 FreeBSD에서 실행할 수 있는 대중적인 오픈 소스 소프트웨어 TCP/HTTP 로드 밸런서 및 프록시 솔루션입니다. 가장 일반적인 용도는 여러 서버(예: 웹, 애플리케이션, 데이터베이스)에 워크로드를 분산하여 서버 환경의 성능과 안정성을 개선하는 것입니다. GitHub, Imgur, Instagram 및 Twitter를 포함하여 많은 유명 환경에서 사용됩니다.

이 자습서에서는 SSL 종료, 트래픽 암호화 및 웹 서버 로드 밸런싱을 위해 HAProxy를 사용하는 방법을 살펴보겠습니다. 또한 HAProxy를 사용하여 HTTP 트래픽을 HTTPS로 리디렉션하는 방법도 보여줍니다.

기본 SSL 지원은 2014년 6월 안정적인 버전으로 출시된 HAProxy 1.5.x에서 구현되었습니다.

전제 조건

이 자습서를 완료하려면 다음을 가지고 있거나 얻어야 합니다.

  • HTTP(포트 80)에서 수신 대기하는 사설 네트워킹이 있는 하나 이상의 웹 서버
  • HAProxy를 설치할 추가 VPS에 대한 루트 액세스. 루트 액세스 설정 지침은 여기에서 찾을 수 있습니다(3단계 및 4단계): Ubuntu 14.04를 사용한 초기 서버 설정.
  • 도메인 이름 또는 IP 주소와 일치하는 "일반 이름\이 있는 SSL 인증서 및 개인 키 쌍

SSL 인증서와 개인 키 쌍이 아직 없는 경우 계속하기 전에 하나를 얻으십시오. 다음은 SSL 인증서 생성을 다루는 단계가 포함된 몇 가지 자습서입니다.

  • StartSSL 인증서 생성(private.keyssl.crt)
  • Ubuntu 14.04에서 자체 서명된 SSL 인증서 생성(2단계–apache.keyapache.crt)

결합된 PEM SSL 인증서/키 파일 생성

HAProxy로 SSL 종료를 구현하려면 SSL 인증서와 키 쌍이 적절한 형식인 PEM인지 확인해야 합니다. 대부분의 경우 SSL 인증서(인증 기관에서 제공하는 .crt 또는 .cer 파일)와 해당 개인 키(사용자가 생성한 .key 파일)를 간단히 결합할 수 있습니다. 인증서 파일이 example.com.crt이고 개인 키 파일이 example.com.key라고 가정하면 다음은 파일을 결합하는 방법의 예입니다.

cat example.com.crt example.com.key > example.com.pem
sudo cp example.com.pem /etc/ssl/private/

그러면 example.com.pem이라는 결합된 PEM 파일이 생성되어 /etc/ssl/private에 복사됩니다. 항상 그렇듯이 PEM 파일(개인 키 포함)을 포함하여 개인 키 파일의 모든 복사본을 보호해야 합니다.

경우에 따라 CA 루트 인증서와 CA 중간 인증서를 PEM 파일에 복사해야 할 수도 있습니다.

시작 환경

시작하는 환경은 다음과 같습니다.

웹 서버에서 이미 SSL을 사용 중이거나 별도의 데이터베이스 서버가 있는 경우와 같이 환경이 예제와 다른 경우 환경에 맞게 이 자습서를 조정할 수 있어야 합니다.

레이어 7 로드 밸런싱, 백엔드 또는 ACL과 같은 기본 로드 밸런싱 개념이나 용어에 익숙하지 않은 경우 기본 사항을 설명하는 HAProxy 및 로드 밸런싱 개념 소개 문서를 참조하십시오.

우리의 목표

이 튜토리얼을 마치면 다음과 같은 환경을 갖기를 원합니다.

즉, 사용자는 HTTPS를 통해 HAProxy 서버에 연결하여 웹사이트에 액세스합니다. 이 서버는 SSL 세션을 해독하고 암호화되지 않은 요청을 포트 80의 사설 네트워크 인터페이스를 통해 웹 서버(즉, www-backend의 서버)로 전달합니다. . 그러면 웹 서버가 응답을 HAProxy 서버로 보내고 응답을 암호화하여 원래 요청을 한 사용자에게 다시 보냅니다.

동일한 콘텐츠를 제공하는 한 원하는 만큼의 웹 서버로 www-backend를 설정할 수 있습니다. 즉, 단일 서버로 이를 설정한 다음 나중에 원하는 만큼 서버를 추가하여 확장할 수 있습니다. 트래픽이 증가함에 따라 사용자 트래픽을 처리할 시스템 리소스가 충분하지 않으면 HAProxy 서버에 성능 병목 현상이 발생할 수 있습니다.

참고: 이 자습서에서는 웹/응용 프로그램 서버가 동일한 콘텐츠를 제공하는지 확인하는 방법을 다루지 않습니다. 이는 종종 응용 프로그램 또는 웹 서버에 따라 다르기 때문입니다.

HAProxy 1.6.x 설치

개인 네트워킹으로 새 VPS를 만듭니다. 이 자습서에서는 haproxy-www라고 부르지만 원하는 대로 이름을 지정할 수 있습니다.

haproxy-www VPS에서 전용 PPA를 apt-get에 추가합니다.

sudo add-apt-repository ppa:vbernat/haproxy-1.6

그런 다음 apt 캐시를 업데이트합니다.

sudo apt-get update

그런 다음 다음 명령을 사용하여 apt-get으로 HAProxy 1.6을 설치합니다.

sudo apt-get install haproxy

이제 HAProxy 1.6이 설치되었으므로 구성하겠습니다!

HAProxy 구성

HAProxy의 구성 파일은 /etc/haproxy/haproxy.cfg에 있으며 두 개의 주요 섹션으로 나뉩니다.

  • 글로벌: 프로세스 전체 매개변수 설정
  • 프록시: defaults, listen, frontendbackend 섹션으로 구성

다시 말하지만, HAProxy 또는 기본 로드 밸런싱 개념 및 용어에 익숙하지 않은 경우 HAProxy 및 로드 밸런싱 개념 소개 링크를 참조하십시오.

HAProxy 구성: 글로벌

모든 HAProxy 구성은 HAProxy VPS인 haproxy-www에서 수행해야 합니다.

편집기에서 haproxy.cfg를 엽니다.

sudo vi /etc/haproxy/haproxy.cfg

globaldefaults의 두 섹션이 이미 정의되어 있음을 알 수 있습니다.

가장 먼저 할 일은 maxconn을 적당한 숫자로 설정하는 것입니다. 이 설정은 HAProxy가 허용하는 동시 연결 수에 영향을 미치므로 QoS에 영향을 미치고 너무 많은 요청을 처리하려는 웹 서버 충돌을 방지할 수 있습니다. 당신은 당신의 환경에 적합한 것을 찾기 위해 그것을 가지고 놀아야 할 것입니다. 구성의 global 섹션에 다음 줄(합리적이라고 생각하는 값 포함)을 추가합니다.

   maxconn 2048

이 줄을 추가하여 생성되는 임시 DHE 키의 최대 크기를 구성합니다.

   tune.ssl.default-dh-param 2048

그런 다음 defaults 섹션에서 mode http라는 줄 아래에 다음 줄을 추가합니다.

   option forwardfor
   option http-server-close

forwardfor 옵션은 각 요청에 X-Forwarded-For 헤더를 추가하도록 HAProxy를 설정하고 http-server-close 옵션은 연결을 닫음으로써 HAProxy와 사용자 간의 대기 시간을 줄이지만 keep-alive 유지.

HAProxy 구성: 통계

HAProxy 통계를 사용하면 HAProxy가 들어오는 트래픽을 처리하는 방법을 결정하는 데 유용할 수 있습니다. HAProxy 통계 페이지를 활성화하려면 defaults 섹션에 다음 행을 추가하십시오(사용자 및 암호를 보안 값으로 대체).

   stats enable
   stats uri /stats
   stats realm Haproxy\ Statistics
   stats auth user:password

이렇게 하면 /stats(예: https://example.com/stats)에서 도메인으로 이동하여 HAProxy 통계 페이지를 볼 수 있습니다.

아직 구성 파일을 닫지 마십시오! 다음에 프록시 구성을 추가합니다.

HAProxy 구성: 프록시

프런트엔드 구성

첫 번째로 추가하고 싶은 것은 들어오는 HTTP 연결을 처리하기 위한 프런트엔드입니다. 파일 끝에 www-http라는 프런트엔드를 추가해 보겠습니다. haproxy_www_public_IP를 haproxy-www VPS의 공용 IP로 바꾸십시오.

frontend www-http
   bind haproxy_www_public_IP:80
   reqadd X-Forwarded-Proto:\ http
   default_backend www-backend

다음은 위의 프런트엔드 구성 스니펫의 각 행이 의미하는 바에 대한 설명입니다.

  • 프론트엔드 www-http:"www-http\라는 프론트엔드 지정
  • bind haproxy_www_public_IP:80: haproxy_www_public_IP를 haproxy-www의 공용 IP 주소로 바꿉니다. 이렇게 하면 이 프런트엔드가 이 IP 주소 및 포트 80(HTTP)에서 들어오는 네트워크 트래픽을 처리할 것이라고 HAProxy에 알립니다.
  • reqadd X-Forwarded-Proto:\\ http:HTTP 요청의 끝에 http 헤더를 추가합니다.
  • default_backend www-backend: 이 프런트엔드가 수신하는 모든 트래픽이 다음 단계에서 정의할 www-backend로 전달되도록 지정합니다.

다음으로 들어오는 HTTPS 연결을 처리하기 위해 프런트엔드를 추가합니다. 파일 끝에 www-https라는 프런트엔드를 추가해 보겠습니다. haproxy_www_public_IP를 haproxy-www VPS의 공용 IP로 바꾸십시오.

frontend www-https
   bind haproxy_www_public_IP:443 ssl crt /etc/ssl/private/example.com.pem
   reqadd X-Forwarded-Proto:\ https
   default_backend www-backend

  • 프론트엔드 www-https: "www-https\라는 프런트엔드 지정
  • bind haproxy_www_public_IP:443 ssl crt …: haproxy_www_public_IP를 haproxy-www의 공용 IP 주소로 교체하고 example.com.pem을 조합된 SSL 인증서 및 키 쌍으로 교체합니다. pem 형식. 이렇게 하면 이 프런트엔드가 이 IP 주소 및 포트 443(HTTPS)에서 들어오는 네트워크 트래픽을 처리할 것이라고 HAProxy에 알립니다.
  • reqadd X-Forwarded-Proto:\\ https: HTTPS 헤더를 HTTPS 요청의 끝에 추가
  • default_backend www-backend: 이 프런트엔드가 수신하는 모든 트래픽이 다음 단계에서 정의할 www-backend로 전달되도록 지정합니다.

백엔드 구성

프런트엔드 구성을 마친 후 다음 줄을 추가하여 백엔드를 계속 추가합니다. 강조 표시된 단어를 웹 서버의 각 사설 IP 주소로 바꾸십시오.

backend www-backend
   redirect scheme https if !{ ssl_fc }
   server www-1 www_1_private_IP:80 check
   server www-2 www_2_private_IP:80 check

다음은 위의 백엔드 구성 스니펫의 각 행이 의미하는 바에 대한 설명입니다.

  • backend www-backend: www-backend라는 백엔드 지정
  • redirect scheme https if !{ ssl_fc }: 이 줄은 HTTP 요청을 HTTPS로 리디렉션하여 사이트를 HTTPS 전용으로 만듭니다. HTTP와 HTTPS를 모두 허용하려면 이 줄을 제거하십시오.
  • server www-1 …: www-1이라는 백엔드 서버, 사설 IP(대체해야 함) 및 수신 포트 80을 지정합니다. . check 옵션은 로드 밸런서가 이 서버에서 주기적으로 상태 점검을 수행하도록 합니다.
  • server www-2 …: 이전 행과 유사합니다. 로드 밸런서에 더 많은 서버를 추가하려면 적절한 이름과 IP 주소를 사용하여 이와 같은 행을 추가하십시오.

이제 haproxy.cfg를 저장하고 종료합니다. 이제 HAProxy를 시작할 준비가 되었지만 먼저 로깅을 활성화하겠습니다.

HAProxy 로깅 활성화

HAProxy에서 로그인을 활성화하는 것은 매우 간단합니다. 먼저 rsyslog.conf 파일을 편집합니다.

sudo vi /etc/rsyslog.conf

그런 다음 다음 두 줄을 찾아 주석 처리를 제거하여 UDP syslog 수신을 활성화합니다. 완료되면 다음과 같이 표시됩니다.

$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1

이제 rsyslog를 다시 시작하여 새 구성을 활성화하십시오.

sudo service rsyslog restart

이제 HAProxy 로깅이 활성화되었습니다! 로그 파일은 HAProxy가 시작되면 /var/log/haproxy.log에 생성됩니다.

HAProxy 시작

haproxy-www에서 HAProxy를 시작하여 구성 변경 사항을 적용합니다.

sudo service haproxy restart

HAProxy는 이제 SSL 종료를 수행하고 웹 서버의 로드 밸런싱을 수행합니다! 로드 밸런싱 서버는 이제 공용 IP 주소 또는 로드 밸런서의 도메인 이름인 haproxy-www를 통해 사용자가 액세스할 수 있습니다. 모든 것이 올바르게 설정되었는지 확인하기 위해 확인해야 할 몇 가지 사항이 있습니다.

확인 사항

  • 아직 하지 않은 경우 도메인이 haproxy-www 서버의 공개 IP 주소를 가리키도록 네임서버를 업데이트합니다.
  • 서버가 HTTPS만 사용하도록 하려면 웹 서버(예: www-1, www-2 등)가 포트 80에서 개인 IP 주소만 수신하도록 해야 합니다. 그렇지 않으면 사용자는 공개 IP 주소에서 HTTP(암호화되지 않음)를 통해 웹 서버에 액세스할 수 있습니다.
  • HTTPS를 통해 haproxy-www를 방문하고 작동하는지 확인합니다.
  • HTTP를 통해 haproxy-www를 방문하고 HTTPS로 리디렉션되는지 확인합니다(HTTP와 HTTPS를 모두 허용하도록 구성한 경우 제외).

참고: WordPress와 같이 자체 URL을 알아야 하는 애플리케이션을 사용하는 경우 URL 설정을 "http”에서 https로 변경해야 합니다. WordPress 예제를 따르려면 WordPress 일반 설정으로 이동한 다음 WordPress 주소(URL) 및 사이트 주소(URL)를 "http”에서 "https”로 변경합니다.

결론

이제 SSL 연결을 처리하고 서버 환경을 수평으로 확장하는 데 사용할 수 있는 로드 밸런서 솔루션이 있습니다. 이 가이드에서 배운 내용을 다른 HAProxy 가이드와 자유롭게 결합하여 환경을 더욱 개선하십시오!