HAProxy 를 통한 Rewrite 및 Redirection 구현 및 SSL/TLS 적용
HAProxy 는 고성능의 TCP/HTTP 로드 밸런서 및 프록시 서버로, 다양한 웹 트래픽 관리 기능을 제공합니다.
이 포스트에서는 HAProxy를 사용하여 URL Rewrite 및 Redirection을 구현하고, SSL/TLS를 적용하는 방법을 알아보겠습니다. 이를 통해 보안성과 성능을 동시에 향상시키는 방법을 배울 수 있습니다.
HAProxy 가 설치되어 있다는 전제 하에 가이드가 진행됩니다. HAProxy LTS 버전 설치에 관한 NGINX STORE의 “HAProxy LTS 버전 Package 설치 및 리버스 프록시 구현“ 포스트를 참고하세요.
목차
1. HAProxy 를 통한 URL Rewrite 및 Redirection 구현
1-1. Rewrite와 Redirection의 차이
1-2. HAProxy를 통한 Rewrite 구현
1-3. HAProxy를 통한 Redirection 구현
2. HAProxy 를 통한 SSL/TLS 적용
2-1. SSL/TLS의 중요성
2-2. HAProxy SSL/TLS 적용하기
1. HAProxy 를 통한 URL Rewrite 및 Redirection 구현
HAProxy를 사용하면 URL을 Rewrite하거나 Redirection할 수 있습니다. 이 섹션에서는 이러한 기능을 구현하는 방법을 살펴보겠습니다.
1-1. Rewrite와 Redirection의 차이
- Rewrite: URL Rewrite는 클라이언트의 요청 URL을 다른 URL로 내부적으로 변경하는 것을 의미합니다. 클라이언트는 이러한 변경을 인식하지 못합니다. 예를 들어, 클라이언트가
http://example.com/old-path를 요청하면 서버는 이를 내부적으로http://example.com/new-path로 변경하여 처리합니다. - Redirection: Redirection은 클라이언트의 요청을 다른 URL로 리다이렉트하는 것을 의미합니다. 클라이언트는 이 변경을 인식하고 새로운 URL로 이동합니다. 예를 들어, 클라이언트가
http://example.com/old-page를 요청하면 서버는 클라이언트를http://example.com/new-page로 리다이렉트합니다.
1-2. HAProxy를 통한 Rewrite 구현
HAProxy에서 URL Rewrite를 설정하는 방법을 설명합니다. 예를 들어, 특정 경로로 들어오는 요청을 다른 경로로 재작성할 수 있습니다.
reqrep 명령어를 사용하여 요청 URL을 재작성하는 설정 예제입니다.
frontend http-front
bind *:80
http-request set-path %[path,regsub(^/old-path,/new-path)]
default_backend http_back
backend http_back
server server1 192.168.1.1:80 check
frontend http-in
이 줄은 frontend 섹션의 시작을 나타냅니다. frontend는 HAProxy가 클라이언트로부터의 요청을 수신하는 논리적인 접점을 정의합니다. http-in은 이 frontend 섹션의 이름으로, 원하는 대로 설정할 수 있습니다.
bind *:80
bind 지시어는 HAProxy가 클라이언트 요청을 수신할 IP 주소와 포트를 지정합니다. *는 모든 IP 주소에서 오는 요청을 수락한다는 의미이고, 80은 HTTP 트래픽을 위한 표준 포트입니다.
http-request set-path %[path,regsub(^/old-path,/new-path)]
http-request 지시어는 HTTP 요청을 처리하는 다양한 액션을 지정합니다. 여기서는 set-path 액션을 사용하여 URL 경로를 변경합니다. regsub 함수는 정규 표현식을 사용하여 문자열을 대체합니다. %[path,regsub(^/old-path,/new-path)]는 요청 URL 경로에서 /old-path를 /new-path로 변경합니다.
^/old-path: 이 정규 표현식은 URL 경로의 시작 부분이/old-path로 시작하는지를 확인합니다./new-path:old-path가 발견되면 이 경로로 대체됩니다.
default_backend http_back
default_backend 지시어는 백엔드 서버 그룹을 지정합니다. 여기서는 http_back라는 이름의 백엔드 서버 그룹으로 요청을 전달합니다.
backend http_back
이 줄은 backend 섹션의 시작을 나타냅니다. backend는 HAProxy가 요청을 전달할 실제 서버를 정의합니다. http_back는 이 backend 섹션의 이름으로, 앞서 default_backend 지시어에서 참조된 이름과 일치해야 합니다.
server server1 192.168.1.1:80 check
server 지시어는 백엔드 서버를 정의합니다. 여기서는 server1이라는 이름을 가진 서버를 정의하며, IP 주소는 192.168.1.1이고 포트는 80입니다. check는 HAProxy가 이 서버의 상태를 주기적으로 확인하도록 합니다. 서버가 응답하지 않으면 HAProxy는 해당 서버로의 요청을 중단하고 다른 서버로 요청을 분배합니다.
전체적인 구성 동작 흐름은 다음과 같습니다.
- 요청 수신: 클라이언트가 HTTP 포트 80으로 요청을 보냅니다.
- URL 변경: 요청 URL 경로가
/old-path로 시작하면/new-path로 변경합니다. - 백엔드 서버로 전달: 변경된 URL을 가진 요청을
backend http_back섹션에 정의된server1로 전달합니다.
$ curl localhost/old-path
{"server":{"address":"172.17.0.6","port":"80","uri":"/new-path", "version":"v1"}}
이 설정은 특정 URL 경로를 다른 경로로 변경하고, 그 요청을 백엔드 서버로 전달하는 간단한 HAProxy 설정 예제입니다.
1-3. HAProxy를 통한 Redirection 구현
frontend http_front
bind *:80
http-request redirect location http://example.com/new-page code 301 if { path_beg /old-page }
default_backend http_back
backend http_back
server server1 192.168.1.1:80 check
각 라인을 설명하겠습니다.
frontend http_front
- 설명: 이 줄은
frontend섹션의 시작을 나타냅니다.frontend는 HAProxy가 클라이언트로부터의 요청을 수신하는 논리적인 접점을 정의합니다.http-front은 이frontend섹션의 이름으로, 원하는 대로 설정할 수 있습니다.
bind *:80
- 설명:
bind지시어는 HAProxy가 클라이언트 요청을 수신할 IP 주소와 포트를 지정합니다.*는 모든 IP 주소에서 오는 요청을 수락한다는 의미이고,80은 HTTP 트래픽을 위한 표준 포트입니다.
http-request redirect location http://example.com/new-page code 301 if { path_beg /old-page }
- 설명:
http-request지시어는 HTTP 요청을 처리하는 다양한 액션을 지정합니다. 여기서는redirect액션을 사용하여 클라이언트를 다른 URL로 리다이렉트합니다.redirect location http://example.com/new-page: 클라이언트를http://example.com/new-page로 리다이렉트합니다.code 301: 301 Moved Permanently 상태 코드를 사용하여 영구 리다이렉트를 지정합니다.if { path_beg /old-page }: 요청 URL이/old-page로 시작하는 경우에만 리다이렉트를 수행합니다.
backend http_back
- 설명: 이 줄은
backend섹션의 시작을 나타냅니다.backend는 HAProxy가 요청을 전달할 실제 서버를 정의합니다.http_back는 이backend섹션의 이름으로, 앞서default_backend지시어에서 참조된 이름과 일치해야 합니다.
server server1 192.168.1.1:80 check
- 설명:
server지시어는 백엔드 서버를 정의합니다. 여기서는server1이라는 이름을 가진 서버를 정의하며, IP 주소는192.168.1.1이고 포트는80입니다.check는 HAProxy가 이 서버의 상태를 주기적으로 확인하도록 합니다. 서버가 응답하지 않으면 HAProxy는 해당 서버로의 요청을 중단하고 다른 서버로 요청을 분배합니다.
전체적인 코드 동작은 다음과 같습니다.
- 요청 수신: 클라이언트가 HTTP 포트 80으로 요청을 보냅니다.
- URL 검사 및 Redirect: 요청 URL 경로가
/old-page로 시작하면 클라이언트를http://example.com/new-page로 301 Moved Permanently 상태 코드와 함께 리다이렉트합니다. - 백엔드 서버로 전달: 조건에 맞지 않는 요청은
backend http_back섹션에 정의된server1로 전달됩니다.
$ curl localhost/old-page
{"server":{"address":"172.17.0.6","port":"80","uri":"/new-page", "version":"v1"}}
이 설정은 특정 URL 경로를 다른 URL로 리다이렉트하고, 그 요청을 백엔드 서버로 전달하는 간단한 HAProxy 설정 예제입니다.
2. HAProxy 를 통한 SSL/TLS 적용
웹 서버의 보안을 강화하기 위해 HAProxy에서 SSL/TLS를 적용하는 방법을 다룹니다.
2-1. SSL/TLS의 중요성
SSL/TLS는 데이터 전송 시 암호화를 통해 보안을 강화하는 프로토콜입니다. 이를 통해 데이터 도청 및 변조를 방지할 수 있습니다. 웹사이트의 보안성과 사용자 신뢰도를 높이는 데 SSL/TLS는 필수적입니다. SSL/TLS를 통해 웹사이트는 HTTPS를 사용하게 되어 사용자의 개인 정보와 데이터를 안전하게 보호할 수 있습니다.
2-2. HAProxy SSL/TLS 적용하기
HAProxy에서 SSL/TLS를 설정하는 방법을 설명합니다. SSL 인증서를 설치하고, 설정 파일에 SSL/TLS를 적용하는 방법을 다룹니다.
다음은 SSL 인증서를 사용해 SSL/TLS를 설정하는 예제 코드입니다.
frontend https-fronted
bind *:443 ssl crt /etc/haproxy/ssl/cert.pem
default_backend servers
backend https-backend
server server1 192.168.1.1:80 check
이 설정은 cert.pem 파일에 저장된 SSL 인증서를 사용하여 443 포트에서 SSL/TLS를 적용합니다. 이를 통해 클라이언트와 서버 간의 통신이 암호화되어 안전하게 이루어집니다.
3. 결론
이 포스트를 통해 HAProxy를 이용한 URL Rewrite 및 Redirection 구현 방법과 SSL/TLS 설정 및 적용 방법을 숙지하게 될 것입니다. 이를 통해 웹 서버의 보안성과 성능을 향상시킬 수 있습니다. HAProxy의 다양한 기능을 활용하여 웹 트래픽을 효율적으로 관리하고, 보안을 강화해 보세요.
해당 포스트에 나온 모든 HAProxy 구성 코드는 NGINX STORE Github의 HAProxy 레포지토리에서 확인할 수 있습니다.