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는 해당 서버로의 요청을 중단하고 다른 서버로 요청을 분배합니다.

전체적인 구성 동작 흐름은 다음과 같습니다.

  1. 요청 수신: 클라이언트가 HTTP 포트 80으로 요청을 보냅니다.
  2. URL 변경: 요청 URL 경로가 /old-path로 시작하면 /new-path로 변경합니다.
  3. 백엔드 서버로 전달: 변경된 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는 해당 서버로의 요청을 중단하고 다른 서버로 요청을 분배합니다.

전체적인 코드 동작은 다음과 같습니다.

  1. 요청 수신: 클라이언트가 HTTP 포트 80으로 요청을 보냅니다.
  2. URL 검사 및 Redirect: 요청 URL 경로가 /old-page로 시작하면 클라이언트를 http://example.com/new-page로 301 Moved Permanently 상태 코드와 함께 리다이렉트합니다.
  3. 백엔드 서버로 전달: 조건에 맞지 않는 요청은 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 레포지토리에서 확인할 수 있습니다.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required