Help us understand the problem. What is going on with this article?

Traefik さえ使えば、nginx がリバースプロキシとして動くのは不要!

背景

同一のサーバ上で複数サービスをホストする際に普段 nginx または apache を使いましたが、設定を調整するたびに何を書いたかなかなか覚えられませんので。。

そこで、 Traefik を使えばいいです!

Traefik とは

公式 HP より:

An open-source reverse proxy and load balancer for HTTP and TCP-based applications that is easy, dynamic, automatic, fast, full-featured, production proven, provides metrics, and integrates with every major cluster technology... No wonder it's so popular!

Traefik は、HTTP・TCP アプリのリバースプロキシかつロードバランサです。いろんな技術と連携があり、どんなスタックでも簡単に導入することができます。

特に Docker との相性が良くて気に入り、この記事は Docker + Traefik を中心にしたいと思います。

Example

今回は、myserver.test という架空なドメインでブログと Wiki サービスを立ち上げたく、各サービスの詳細は以下のようです。

サービス アプリ URL
Blog Ghost blog.myserver.test
Wiki DokuWiki wiki.myserver.test

ドメインを用意

実際に持っているドメインであればドメインの A レコードを追加し、なければ host ファイルに以下の項目を追加すればローカルで動いて試すことができます。

# /etc/hosts
127.0.0.1     blog.myserver.test
127.0.0.1     wiki.myserver.test

Docker を用意

複数 Docker のコンテナを管理すると Docker Compose 便利なので、早速コンフィグファイルを作りました。

## docker-compose.yml

version: '2'

services:
  ghost:
    image: ghost:3
    ports:
      - 5001:2368
    volumes:
      - ./data/ghost:/var/lib/ghost/content

  dokuwiki:
    image: bitnami/dokuwiki:0
    ports:
      - 5002:80
    volumes:
      - ./data/dokuwiki:/bitnami

これで docker-composer up を実行すると、 ブログは http://localhost:5001 からアクセスでき、Wiki の方は http://localhost:5002 からアクセスできます。

Traefik を導入

せっかく docker を使っているため、 Traefik の Docker イメージを導入しましょう。

## docker-compose.yml

services:
  # ghost,dokuwiki を省略
  traefik:
    image: traefik:2.0
    ports:
      - 5003:8080 # webUI
      - 80:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./config/traefik/traefik.yml:/etc/traefik/traefik.yml

マウントする volumes ですが、Traefik の設定が定義されるファイル以外は、Docker API にアクセスできるため docker.sock もマウントすることが必要です。Traefik は、サービスのステータスを常に監視し、サービスが動いてない時はリバースプロキシを無効するという機能が付いています。

Traefik を設定

volumes で定義されたコンフィグファイルを作りましょう。

# ./config/traefik/traefik.yml

# Providers config
providers:
  docker: {} # Docker との連携を有効

# API/Dashboard config
api:
  insecure: true # WebUI にアクセスできるように設定

Traefik のホスト名を各サービスに定義

最後に、各コンテナにホスト名、つまり URL を指定すれば完了です。

# docker-compose.yml
  ghost:
    labels:
      - "traefik.http.routers.ghost.rule=Host(`blog.myserver.test`)"

  dokuwiki:
    labels:
      - "traefik.http.routers.dokuwiki.rule=Host(`wiki.myserver.test`)"

Traefik を起動

これで準備が整ったので、再度で docker-compose up を実行すると Traefik が起動されます。 http://localhost:5003 から WebUI を見れます。

image.png

blog.myserver.test にアクセスするとこんな感じ:

image.png

wiki.myserver.test にアクセスするとこんな感じです。

image.png

【おまけ】 HTTPS 化も楽勝!

Traefik では Let's Encrypt との連携もあり、traefik.yml に以下を定義すれば簡単に HTTPS を導入することができます。

# ./config/traefik/traefik.yml
entryPoints:
  web:
    address: ":80"

  web-secure:
    address: ":443"

certificatesResolvers:
  sample:
    acme:
      email: webmaster@myserver.test
      storage: acme.json
      httpChallenge:
        entryPoint: web

詳しくはドキュメンテーションをご参照ください。

まとめ

特に複雑なルールの設定が必要なく、シンプルなリバースプロキシが望ましい場合は、 Traefik を試す価値があるじゃないかと思います。

Reference

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした