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.key 및 ssl.crt)
- Ubuntu 14.04에서 자체 서명된 SSL 인증서 생성(2단계–apache.key 및 apache.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, frontend 및 backend 섹션으로 구성
다시 말하지만, HAProxy 또는 기본 로드 밸런싱 개념 및 용어에 익숙하지 않은 경우 HAProxy 및 로드 밸런싱 개념 소개 링크를 참조하십시오.
HAProxy 구성: 글로벌
모든 HAProxy 구성은 HAProxy VPS인 haproxy-www에서 수행해야 합니다.
편집기에서 haproxy.cfg를 엽니다.
sudo vi /etc/haproxy/haproxy.cfg
global 및 defaults의 두 섹션이 이미 정의되어 있음을 알 수 있습니다.
가장 먼저 할 일은 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 가이드와 자유롭게 결합하여 환경을 더욱 개선하십시오!