24時

アジカンの24時が好きな(自称)女子中学生

CaddyでHTTPS通信

「Caddyを使うとこんな簡単にHTTPSの通信ができるんだよ」っていう紹介

Caddy

すごいWebサーバーだよ

  • HTTP/2.0が使える
  • Let's Encryptで証明書の取得を簡単に行なってくれる
  • 実装はGo
  • プロキシとして動作させられる
  • QUIC対応

...etc

お遊び

Nginxへの通信の間でCaddyを動かし、HTTPS通信を行うようにしてみます。Caddyはリバースプロキシとしての役割を担います。

CaddyとNginxはDockerのコンテナで動かします。Caddyコンテナのポートは外部に公開しますが、Nginxコンテナのポートは公開しません。図にするとこんな感じ。

f:id:etogen:20180314145715p:plain

Nginxのコンテナ作成

コンテナにnginxっていう名前をつけて作成します

$ docker run -d --name nginx nginx:latest

Caddyのコンテナ作成

コンテナ作成には以下のようなファイル群を使用します。

.
├── caddy
│   ├── Caddyfile
│   └── config
│       └── example.conf
└── caddy.sh

caddy/Caddyfile

Caddyの設定ファイルです。importで他のファイルに書いてある設定を読み込めます。別にimportしなくても、後述するexample.confの設定を直接ここに書いてもいいです。

Caddyfile
import /etc/caddy/config/*.conf

caddy/config/example.conf

Caddyfileで読み込まれる設定ファイル。ファイル名のexampleの部分は適宜変更してください。

example.conf
example.com {
  # log / stdout "{combined}" {}
  log / /var/log/caddy/access.log {
    rotate_size 100 # 100MB超えたらロテート
    rotate_age 30 # 30日でロテート
  }

  proxy / nginx:80 {
    # transparent
    # websocket
  }
}

ハッシュタグの部分はコメントなので無視してもらってかまいません(ほぼ自分用に残してます。ごめんなさい)

ここではexample.comでアクセスしてきたクライアントに対する振る舞いを設定しています。example.comの部分はご自分のドメインに書き換えてください。

logディレクティブではCaddyのアクセスログに関する設定をしています。proxyでは転送先の設定をしています。今回は先ほど作成したNginxのコンテナへリクエストを飛ばすことにしてます。

caddy.sh

Caddyのコンテナを作成するスクリプト

caddy.sh
#!/bin/sh

docker run -d --name caddy -p 80:80 -p 443:443 -v $(pwd)/caddy:/etc/caddy -v $(pwd)/log:/var/log/caddy --link nginx:nginx  abiosoft/caddy --host example.com --email hoge@fuga.com --conf /etc/caddy/Caddyfile

--hostにはドメイン名、--emailにはご自分のE-mailアドレスを指定します。これらの設定はLet's Encryptによる証明書の取得に必要です。

コンテナ作成

$ ./caddy.sh

アクセスしてみる

Nginxのページが表示されれば成功。ちなみにHTTPでアクセスするとHTTPSにリダイレクトされます。

f:id:etogen:20180314153749p:plain