Skip to content

traefikでリバースプロキシ構築

Posted on:October 13, 2024 at 07:26 AM

Traefikでリバースプロキシ構築

Traefikとは

GitHub - traefik/traefik: The Cloud Native Application Proxy
The Cloud Native Application Proxy. Contribute to traefik/traefik development by creating an account on GitHub.
GitHub - traefik/traefik: The Cloud Native Application Proxy favicon https://github.com/traefik/traefik
GitHub - traefik/traefik: The Cloud Native Application Proxy

traefikとは高効率かつ、現代のコンテナ・マイクロサービスネイティブなリバースプロキシである

traefikは、サービスが追加されるたび、サービスディスカバリによって自動でプロキシが構築されるようになっており、

例として、事前にdockerのソケットに繋いでおくと、dockerのlabelにtraefik.enable=trueがあるものを自動でディスカバリし、 以下のラベルのhostnameでリバースプロキシしてくれるようになる

traefik.http.routers.service名.rule(`hostname`)

つまり、後からサービスをどんどん追加していっても本体のコンフィグは触る必要がない

nginxのようにサービスを追加するたびにコンフィグをいじる必要はないのが現代のマイクロサービス向きといえる

Traefikをインストールしテストする

今回はDockerにて導入

traefikでhttpbinサーバーとnginxサーバーにプロキシすることを考える

下図は頑張ってmermaidで書いた図

hogefuga

まずTraefikの設定を行うが、configファイルはtraefik.ymlという名前で作成する 最終的なディレクトリ構成は以下の予定とする。

.
├── docker-compose.yml
└── traefik.yml

Traefikのコンフィグを作成する

Traefikサーバーのコンフィグは、

なお、これらはdocker-compose.ymlの起動時のコマンドなどでも設定可能だ

traefik.ymlは以下のとおりに設定した


entryPoints:
  http:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: https
          scheme: https
  https:
    address: ":443"
    asDefault: true
    http:
      tls:
        certResolver: letsencrypt

  traefik:
    address: ":8080"


accessLog:
  filePath: /var/log/traefik-access.log
log:
  level: INFO
  filePath: /var/log/traefik.log

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
    network: external

api:
  dashboard: true
  insecure: true


certificatesResolvers:
  letsencrypt:
    acme:
      email: <email>
      tlsChallenge: true
      storage: /letsencrypt/acme.json

なお、上記の設定は全てdocker run時のcommandでも設定が可能だ。

Traefikのdockerコンテナを立てる

現時点のディレクトリ構成

.
├── docker-compose.yml
└── traefik.yml

まずは、以下のとおりtraefikサービスのみたててみる

docker-compose.yml

services:
  traefik:
    image: traefik:v3.0
    ports:
      - 80:80
      - 443:443
      - 8080:8080
    networks:
      - proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - letsencrypt:/letsencrypt
      - /var/log:/var/log
      - ./traefik.yml:/etc/traefik/traefik.yml
    command:
      - --providers.docker.network=proxy

networks:
  proxy:
    name: proxy

volumes:
  letsencrypt:
    name: letsencrypt

設定でいうことは特になし。

これでdocker compose up -d して、localhost:8080に接続した場合、以下の通りのページが表示される。

dashboard

この、HTTPタブを開くと、以下の通りの画面が表示される

httptab

これを見ると現時点では、api、dashboard、http to httpsのリダイレクトルーティングしかないことがわかる

nginxのサービスをたててroutingしてみる

docker-compose.ymlを以下のように変更する

services:
  traefik:
~~~~~~~~~~~~
# 以下を追加
  nginx:
    image: nginx
    networks:
      - proxy
    labels:
      - traefik.enable=true
      - traefik.http.routers.nginx.rule=Host(`nginx.host.name`)
      - traefik.http.services.nginx.loadbalancer.server.port=80
~~~~~~~~~~~~
networks:

そしてdocker compose up -dをする

~/work/traefik-sample$ sudo docker compose up -d
[+] Running 2/2
 ✔ Container traefik-sample-nginx-1    Started                                                                                                                                                                                                                                                0.3s
 ✔ Container traefik-sample-traefik-1  Running

再度ダッシュボードを見ると、nginx.tosukui.xyz(今回は自分のホストネーム)がルーティングに加わっていることがわかる http-tab-nginx

また、実際にhttps://nginx.host.nameにアクセスするとルーティングされる

これは、traefikがdockerのネットワーク内のserviceを観察し、以下のようにラベルの情報を見て処理しているためである

- traefik.enable=true # これがついている場合はtraefikのルーティング対象
- traefik.http.routers.nginx.rule=Host(`nginx.host.name`) # これがついている場合はtraefikから該当のホストネームでルーティングされる
- traefik.http.services.nginx.loadbalancer.server.port=80 # 内部の80番ポートにフォーワーディングする

httpbinサービスを立てる

最終的にこういうコンフィグになる

docker-compose.yml

services:
  traefik:
    image: traefik:v3.0
    ports:
      - 80:80
      - 443:443
      - 8080:8080
    networks:
      - proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - letsencrypt:/letsencrypt
      - /var/log:/var/log
      - ./traefik.yml:/etc/traefik/traefik.yml
    command:
      - --providers.docker.network=proxy

  nginx:
    image: nginx
    networks:
      - proxy
    labels:
      - traefik.enable=true
      - traefik.http.routers.nginx.rule=Host(`nginx.your.host`)
      - traefik.http.services.nginx.loadbalancer.server.port=80

  httpbin:
    image: kennethreitz/httpbin
    networks:
      - proxy
    labels:
      - traefik.enable=true
      - traefik.http.routers.httpbin.rule=Host(`httpbin.your.host`)
      - traefik.http.services.httpbin.loadbalancer.server.port=80

networks:
  proxy:
    name: proxy

volumes:
  letsencrypt:
    name: letsencrypt

そして、docker-compose up -dする

~/work/traefik-sample$ sudo docker compose up -d
[+] Running 3/3
 ✔ Container traefik-sample-httpbin-1  Started                                                                                                                                                                                                                                                0.3s
 ✔ Container traefik-sample-traefik-1  Running                                                                                                                                                                                                                                                0.0s
 ✔ Container traefik-sample-nginx-1    Running

すると以下のようにルーティングが行われており、httpbin.your.hostに接続すると接続成功する httpbin

まとめ

皆さんもTraefikを使ってリバースプロキシや!