Post

Traefik - Regexp로 모든 subdomain에 대하여 forward 처리하기

Docker에서 동작 중인 Traefik에서 Regexp로 모든 subdomain에 대하여 forward 처리하는 방법이다.

Traefik - Regexp로 모든 subdomain에 대하여 forward 처리하기

traefik:v3.1.2

Container

CLI

개요


  • Traefik은 haproxy, nginx와 같이 proxy 해주는 강력한 서비스이다.
    Docker 및 Kubernetes와 같은 container base의 platform에서도 강력한 기능은 자랑하며 쉽게 호환되게 만들어 놨다.
  • 기본적으로 L7(http)로 사용하는경우가 거의 다 이며, 특수한 경우 L4(TCP)로 사용도 가능하다.
  • router, middleware와 같은 용어가 어색할 수 있으머 구성에 어려움을 느낄 수 있지만, web server 및 header를 만지던 사람에게는 나름대로 쉬울 수 있다고 생각한다.
  • CNAME으로 등록되어 있는 subdomain들에 대해서 그대로 사용이 가능해야하며, 안쓰는 모든 subdomain들에 대해서 어떠한 URL로 forward 시키는 방법에 대해 찾아보다 official page에 나와있는 내용이 있어 참고하였다.
  • 사용해보니 uptime check 시 모든 traffic이 main domain을 향하고 있으니 실제로 subdomain의 service에 대해서 확인이 안된다는 단점이 있다.
    이것을 우회하려면 각각의 service에 대해서 직접적으로 port 또는 service 기반으로 확인 해야한다.

ref.

Regexp로 forward 처리하기


제목에 regexp라고 적어놓은 것과 같이 Traefik에서는 regular express(정규 표현식)를 지원을 한다.
여기서 regexp는 *.domain.com에서 *을 처리를 해야해서 필요하다.
또한 여기서 priority부분이 나오는데 이것은 굉장히 중요하다.

router에는 priority(우선순위)가 존재하는데, 이 우선 순위는 숫자가 높을수록 순위가 높다.

Traefik에서 file로 처리도 가능하지만, docker로 구성하면 traffic은 docker의 label 처리가 가장 깔끔하다.
아래의 예시는 docker-compose.yml의 일부이며 실제로 사용하는 labels이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
## docker-compose.yml

#--------------------- 생략 ---------------------#
    labels:
      traefik.enable: true
      traefik.docker.network: proxy

      # ...
      
      # host-redirect
      traefik.http.routers.host-redirect.rule: Host(`$HOST_URL`) || HostRegexp(`^.+\.$HOST_URL$`)
      traefik.http.routers.host-redirect.priority: 1
      traefik.http.routers.host-redirect.tls: true
      traefik.http.routers.host-redirect.tls.options: $TLS_OPTION
      traefik.http.routers.host-redirect.entrypoints: websecure
      traefik.http.routers.host-redirect.middlewares: host-redirect@docker
      traefik.http.middlewares.host-redirect.redirectregex.regex: ^.+
      traefik.http.middlewares.host-redirect.redirectregex.replacement: https://kuma.$HOST_URL
      traefik.http.middlewares.host-redirect.redirectregex.permanent: true
#--------------------- 생략 ---------------------#

해당 파일에서 HostRegexp(`^.+\.$HOST_URL$`) 부분은 중요하다.
router 구조상 처음에 진입하게 되는 곳이 rule 부분이며, domain.com*domain.com가 가장 먼저 진입하게 되는 곳이다.
그리고 그 아래에 priority부분이 있는데, 이 부분 또한 위에서 쓴 것과 같이 우선 순위가 낮으면 가장 마지막에 작동한다.
즉, 개별적으로 label 또는 파일로 처리 된 모든 CNAME의 대해서 작동 후 마지막에 작동하는 것이다.
이건 subdomain을 처리하는 모든 proxy server라도 똑같다.

router에 대해서 처리가 되었으면 middleware부분이 나오는데 위의 도메인을 그대로 받아들이는 ^.+redirectregex.regex의 처리로 인해 https://kuma.$HOST_URL로 빠지게 되는 구조다.

Dashboard를 통해서도 확인이 가능하다.

host-redirect@docker에 대한 dashboard host-redirect@docker에 대한 dashboard

This post is licensed under CC BY 4.0 by the author.