Web サーバ Caddy(キャディ)についてまとめています。

2020年5月、Caddy 2.0.0 が正式公開されました。
2022年9月には Caddy 2.6.0 が公開されています。
開発はすでに Caddy v2 で更新され、v1 はセキュリティ的な修正に留められます。
そのため、基本的には Caddy v2 での使用がおすすめです。
Caddy v2 と Caddy v1 で異なるところがいくつか存在します。

公式 Web サイトは Caddy v2 向けに置き換えられていて、
Caddy v1 はマニュアルのアーカイブなど、一部情報が残されています。
Caddy 関連で検索する場合など、
Caddy v2・Caddy v1 どちらの記載か注意して参照して下さい。


目次


公式・関連サイト


特徴

Caddy は次の特徴があります。

  • 無料発行できる SSL 証明書 Let’s Encrypt を自動発行・更新し、
    容易に SSL を実現します。 利用者は意識せずに SSL 化を実現します。
    有償発行された SSL 証明書を適用する事もできます。
  • Caddy 2.6 より HTTP/3 に標準対応しています。
    TLS 1.3 にも対応し高速表示を実現しています。
    設定により Zstandard gzip 圧縮も可能です。
  • HTML などに Go 言語のテンプレートを適用できます。
    (Apache の SSI みたいな事ができます)
  • php-fpm(Windows は php-cgi)を用いて PHP の動作が可能です。
  • リバースプロキシに対応しています。
  • Caddyfile はとてもシンプルに記載でき、目的の設定を容易に実現できます。
    json による詳細な設定も可能です。
  • API が存在し、設定などを他から調整できます。
  • モジュールが存在し、機能拡張が可能です。

ここでは、動作させるための必要最低限の情報を記載しています。


インストール

ここではバイナリーでのインストール方法を記載していますが、
ソースも配布されていて、ビルドする事も可能です。

Caddy v2

バイナリー(実行ファイル)が配布されていますので、ダウンロードします。

Windows ではショートカットを作成すると便利です。
(Caddy v2 では caddy run など、必ずオプションが必要になります)

他の OS では /usr/bin や /usr/loal/bin へ caddy を入れます。

 Install | Caddy Documentation

公式手順どおりに行ってうまく動作しない場合、カーネル制御機能を確認して下さい。

Caddy v1

Caddy v1 系の最新 1.0.4 は次からダウンロードできます。
ソースレベルでは 1.0.5 も公開されています。

 caddyserver/caddy tag v1.0.4 | GitHub

公式サイトではダウンロードできなくなっています。

Scoop

🎈 Scoop は Caddy に対応しています。

次のコマンドで容易にインストール可能です。

scoop install caddy

通常最新安定版をインストールします。バージョン指定も可能です。

webinstall.dev・webi

 Caddy | webinstall.dev
🎈 webinstall.dev・webi | ふうせん🎈 FU-SEN

Windows で最新版をダウンロード・インストール:

curl.exe https://webi.ms/caddy | powershell

他の OS で最新版をダウンロード・インストール:

curl -sS https://webi.sh/caddy | sh

Webi で最新安定版をダウンロード・インストール:

webi caddy

Webi では webi caddy@beta でベータ版も簡単にインストールできます。
また Caddy v1 は webi caddy@1.0.4 で 1.0.4 をインストール可能です。
Caddy v1.0.5 はバイナリー公開されていないので、インストールできません。

Caddy 公式サイト

 Download Caddy

公式サイトではモジュールを同梱したバイナリーをダウンロードできます。
以前 Caddy v1 で行われていた配布方法ですが、
Caddy v2 のモジュールが整い、ダウンロードページが改めて設置されています。

xcaddy

 caddyserver/xcaddy | GitHub

xcaddy を使用すると、プラグインを含む Caddy をビルドできます。

 Release | Caddy caddyserver/xcaddy

Release より xcaddy をダウンロードできます。

 caddy | Docker Hub

公式 Docker を使用する場合、caddy:builder に xcaddy が含まれています。
ビルドした Caddy は /usr/bin/caddy にあります。
例えばこのような Dockerfile を作成します。

FROM caddy:<version>-builder AS builder
RUN xcaddy build --with github.com/caddy-dns/cloudflare

FROM caddy:<version>
COPY --from=builder /usr/bin/caddy /usr/bin/caddy

更新

Caddy v2.4 より、すでに Caddy をインストールしている場合は
次のコマンドで Caddy を更新できるようになりました。

caddy upgrade

現在の caddy バイナリーを置き換えます。
モジュールも適用していた場合は適用したバイナリーになるため、
特に公式サイトでダウンロードしたモジュール同梱バイナリーの場合は
この方法で更新すると良いでしょう。


Caddyfile

Caddyfile は Caddy v1 と Caddy v2 で記載が異なります。

Caddy v2

Caddy で動作するサーバが 1 ドメインのみであれば、次のような設定です。

example.net.eu.org

tls mail@ddress.example.net
root * D:\Caddy\example.net.eu.org
encode zstd gzip
file_server

サブドメインや他のドメインも設定したい場合は、ドメイン名毎に { } で囲って下さい。

example.net.eu.org {
  tls mail@ddress.example.net
  root * D:\Caddy\example.net.eu.org
  templates
  encode zstd gzip
  file_server
}

www.example.net.eu.org {
  tls mail@ddress.example.net
  redir https://example.net.eu.org{uri}
}

blog.example.net.eu.org {
  tls mail@ddress.example.net
  root * D:\Caddy\example.net.eu.org
  php_fastcgi 127.0.0.1:9000
  encode zstd gzip
  file_server
}
  • encode - 圧縮を付加します。zstd gzip が設定できます。
  • file_server - ファイルサーバを有効します。通常これを入れます。
  • php_fastcgi - php-fpm または php-cgi の待機先を記載します。
    ポートの代わりに unix//run/php-fpm/www.sock の指定も可能です。
    これを有効にした場合、ファイルが存在しない場合は index.php を参照します。
    (2.0.0b19 は PHP が動作しない不具合があります)
  • redir - 指定 URL へ転送します。末尾 {uri} でドメイン下を継承できます。
  • root - * に引き続き参照先のディレクトリを入れます。
  • tls - SSL サーバ証明書発行申請するメールアドレス(推奨)
    tls 証明書 キー と記載し、有償の証明書を使用する事もできます。
    ポート番号を指定し tls を入れていない場合は HTTP 通信しようとします。
    (Caddy v1 のように tls off と明示するのではなく、tls をなくします)
  • templates -  テンプレート を有効にします。

各値では * や /dir/* を付加して、特定ディレクトリ下での動作が可能です。
例えば次の場合は /blog/ 下で PHP を動作させます。

php_fastcgi /blog/* localhost:9000

より詳細は説明は次を参照して下さい。

 The Caddyfile | Caddy (v2)

Caddy v1

Caddy v1 では、次のような Caddyfile になります。

example.net.eu.org

tls mail@ddress.example.net
root D:\Caddy\example.net.eu.org
gzip
example.net.eu.org {
  tls mail@ddress.example.net
  gzip
  markdown / {
    css /css/blog.css
    js  /css/scripts.js
  }
  errors {
    403 403.html
    404 404.html
    500 500.html
    502 502.html
    503 503.html
  }
}

www.example.net.eu.org {
  tls mail@ddress.example.net
  redir https://example.net.eu.org{uri}
}

blog.example.net.eu.org {
  tls mail@ddress.example.net
  gzip
  fastcgi / 127.0.0.1:9000 php
  on startup php-fpm7
}

こちらに様々な利用方法のサンプルがあります。

 caddyserver/examples | GitHub (Caddy v1)


Q&A

Caddy はどの位の処理能力がありますか?

 Can I use Caddy for a high-traffic site? | Caddy Forum

Caddy 1 では nginx と比較してのベンチテストが行われています。
Caddy 2 はつくりなおされているので、結果が異なると思って下さい。

Caddy を起動できません。

起動できない場合、主な原因は Caddyfile の記載ミスです。

Windows では Caddy v2 の実行ファイルをクリックして起動できません。
PowerShell・コマンド プロンプト・Git Bash などを起動し、
caddy run で起動させて下さい。(PowerShell は ./caddy run )
通常運用時はショートカットを作ると便利です。
ショートカットをスタートアップに入れて自動起動もできます。

Caddyfile は Caddy v1 と Caddy v2 で記載が異なります。
参考にしたページが Caddy v1 向けか Caddy v2 向けか確認して下さい。

自動起動が失敗する場合、起動ファイルもよく確認してみて下さい。

Caddy を起動しますが、ブラウザから参照できません。

例えば Google Chrome で参照した時 ERR_SSL_PROTOCOL_ERROR が出ている場合、
主に Let’s Encrypt からの証明書発行に失敗しています。
例えばネームサーバを切り替えていないか、切り替えたばかりで、
Let’s Encrypt の発行サーバから Caddy が参照できない時です。
この場合、ネームサーバの設定を変更して数時間後に再度起動してみて下さい。
その他、Caddy 起動直後に Let’s Encrypt とやりとりをしているため、
起動から数秒経過してログを参照すると、原因を把握できます。

Let’s Encrypt はレート制限があります。
ログにレート制限の表示が出ている場合は、次を試してみて下さい。

  • 契約したての VPS などで発生した場合、
    Caddy を停止し、tls メールアドレス を付加してから起動してみて下さい。
  • ネームサーバを変更したてで参照できなかったと思われる場合は、
    Caddy を停止し、数時間経過してから起動してみて下さい。
  • 何度も失敗して試行している場合、ドメイン管理数が多く一気に発行した場合は
    24 時間~1 週間待つ必要がある場合もあります。

Let’s Encrypt のページでもレート制限について触れています。

🎈 Let’s Encrypt | ふうせん🎈 FU-SEN

Caddy 2.30 より、Let’s Encrypt の発行に失敗した場合、
ZeroSSL での発行を試みるようになりました。

crt.sh は証明書の発行を確認するのに便利です。

 crt.sh

参照そのものができない場合は、
ファイヤウォールでポートを許可していない場合があります。
通常は 80(HTTP)・443(HTTPS)です。
自宅などのサーバでは、ルータの転送設定が正しいかも確認して下さい。

502 Bad Gateway が出ている場合、Caddy は指定している他サービスを参照できません。
PHP やリバースプロキシを設定した時に発生する場合があります。
主に localhost:9000 などの記載誤りですが、
カーネル制御機能やファイヤウォールが原因の場合もあります。

Caddy v2 で http を使用できますか?

可能です。ポート番号を付けて tls がない場合、http で通信しようとします。
通常 http のポート番号は 80 なので、ドメイン名に :80 を付け、 tls を外して下さい。

example.net.eu.org:80 {
  root * D:\Caddy\example.net.eu.org
  templates
  encode zstd gzip
  file_server
}

Cloudflare CDN を経由できるように設定できますか?

🎈 Cloudflare | ふうせん🎈 FU-SEN

Let’s Encrypt を適用する Web サービスでは問題があります。
また telnet・ssh サーバなど、他のサーバを参照する場合は
参照先が Cloudflare サーバに変更されてしまうため、この方法を使用しないで下さい。
直接 SSL サーバ証明書を適用できるパソコンや VPS・専用サーバ を用いた場合は
Cloudflare が発行するオリジン証明書(Origin Certificates)を発行して
SSL(TLS)通信で実現する事が可能です。

 Cloudflare より使用する ドメイン を選択します。

DNS を選択して、 をオレンジにすると共に、
タイプ=CNAME コンテンツ=参照元サーバ名 または
タイプ=A コンテンツ=参照元 IP アドレス を入れておきます。

SSL/TLS を選択し、お客様の SSL/TLS 暗号化モード を フル (厳密) にします。
オリジンサーバ を選択し、「オリジン証明書」の 証明書を作成 から証明書を発行します。
Windows ではメモ帳などのテキストエディタを起動しておき、
表示された証明書などをエディタへ貼り付けてファイル保存します。
証明書部分は ドメイン名.pem 、キー部分は ドメイン名.key とします。

 Managing Cloudflare Origin CA certificates | Cloudflare

「(Optional) Step 4 - Add Cloudflare Origin CA root certificates」にある
cloudflare_origin_ecc.pem をクリックし、ダウンロード・ファイル保存します。

ここではドメイン名が example.net.eu.org、
保存した証明書関連ファイルを D:\Caddy 内に入れたとして、
Caddyfile は次となります。

example.net.eu.org {
  tls D:\Caddy\example.net.eu.org.pem D:\Caddy\example.net.eu.org.key {
    ca_root D:\Caddy\origin_ca_rsa_root.pem
  }
  root * D:\Caddy\example.net.eu.org
  templates
  encode zstd gzip
  file_server
}

画像ファイルなどはキャッシュ保存後、再度参照する Status は HIT となり、
完全にキャッシュを優先的に出力するようになります。
Cloudflare CDN はデフォルトで .html ファイルをキャッシュに入れません。
必要な場合は設定を行う必要があります。

Google Cloud Run で使用できますか?

ページ運営者が Google Cloud Run での動作を確認できています。
Google Cloud Run を用いる事でサーバのセットアップが不要で、素早く使用できます。

🎈 Caddy を Google Cloud Run で動作させる。| ふうせん🎈 FU-SEN

Docker を使用する他の Web サービスでも使用できますか?

Google Cloud Run 以外に 🎈 Fly (Fly.io)・🎈 Railway
また、サーバインストール型 PaaS 🎈 CapRover・Dokku でも使用できます。

Caddy v2 の公式 Docker イメージを使用しているサンプルは
英語版 Wiki で Dockerfile を公開しています。

🎈 Dockerfile for Web services | 🎈 BALLOON | FU-SEN

日本語ドメインを使用できますか?

使用できる事をサイト運営者が確認できています。
Caddyfile には Punycode(xn-- ではじまる英数)でドメイン名を入れて下さい。

 Can’t use Caddy on punycode IDN domains #3017 | GitHub caddyserver/caddy

悪質対策のために IP アドレスを考慮する必要はありますか?

Caddy では通常 IP アドレスを考慮する必要はありません。
指定していないホスト名の参照があった場合、Caddy は空白ページを返します。
また http→https が発生しますが、通常 IP アドレスで証明書を発行しないので、
TLS handshake error となり、参照できません。
古いバージョンではログにこの表示は残りますが、特に気にする必要はありません。
最近のバージョンではこのようなログ表示も行われません。

フォーラムでは更に突っ込んだ対策も紹介されています。

 Remote IP behavior analysis and ban | Caddy Forum

404 Not Found を作成できますか?

Caddy 2.1 より handle_errors で設定できます。

静的ファイルであれば、通常 Not Found のみを期待できるので、
404.html を表示する前提で、次の記載にできます。

handle_errors {
  rewrite * /404.html
  file_server
}

HTTP ステータスコードで処理を分けたい場合は次の記載が有効です。
これにより 404.html や 403.html などを使用できます。

handle_errors {
  rewrite * /{http.error.status_code}.html
  file_server
}

テンプレートで処理する事も可能です。

handle_errors {
  rewrite * /error.html
  templates
  file_server
}

また php_fastcgi を使用する場合、
.php ファイルがない参照は index.php を参照するので、
index.php で 404 の処理を行うことができます。
この場合は Caddy 2.0 でも使用可能です。

Caddy v1 は errors を用いて実現可能です。

errors {
  404 404.html
}

特定のレスポンスを Caddyfile で指定できますか?

Caddy v2 では respond を用いて可能です。
わざわざファイルを生成する必要なく、Caddyfile で完結できます。

 Respond with multi line body | Caddy Forum

robots.txt を参照した時に BOT を完全拒否するようにする設定の例です。
Caddyfile レベルでこれを処理できます。

respond /robots.txt 200 {
    body "User-agent: *
Disallow: /"
}

確実にするため、Disallow: /" の頭に空白を入れないで下さい。

Caddyfile の設定を他のファイルから導入できますか?

Caddy v2 では import で可能です。この行をファイル内容に置き換えます。
例えば設定しているドメインが多い時に便利です。

import 読み込むファイル名

Caddyfile をカレントとして相対指定ができます。
また import caddy/* のように、ワイルドカード指定も可能です。

.htaccess が動作していません。

.htaccess は Apache 固有の設定ファイルです。Caddy では動作しません。
Caddyfile に相当の設定を追加して下さい。

PHP 以外のプログラミング言語は使用できますか?

多くの言語は使えます。Go などはポート番号で Listen 状態にできるため、
Caddy ではリバースプロキシを用いてこのポートを参照させます。

PHP に限り、長年使われている CMS、フレームワーク動作の考慮で
Caddy v2 では php_fastcgi を用意してあります。

レンタルサーバ会社の者です。レンタルサーバ向けに使用できますか?

 Caddy for business | Caddy Forum

ビジネス的な反応もあるようで、ビジネス向けの情報も公開しはじめています。

 Serving tens of thousands of domains over HTTPS with Caddy | Caddy Forum

具体的な設定のヒントも公開されています。
このドキュメントにもあるとおり、Caddy を継続して使用し、良いものにするためにも
Caddy のスポンサーになる事を検討して下さい。

プラグイン・モジュールって何ですか?

Caddy では機能を拡張できる手段が存在します。

Caddy v2 では モジュール(Modules)です。
ダウンロードページよりモジュール付のバイナリーでダウンロードできるようになりました。

 Download | Caddy

Caddy v1 では公式からダウンロードの時に使用するプラグインを指定します。
例えば次のようなプラグインが存在します。

  • tld.dns.~ - 証明書発行として HTTP 認証の代わりに DNS 認証を使用します。
  • dyndns - ダイナミック DNS を実現します。🎈 Cloudflare などが使えます。
  • http.cgi - CGI 動作を付加します。(いわゆる Perl などを動作させます)
  • http.git - Git リポジトリへ push します。
  • minify - 空白・改行を削除します。

Caddy v1 のプラグインに存在していた機能は
Caddy v2 のモジュールで順次開発されている状況です。

なお、Caddy v1 はプラグインによってバイナリーが変化する仕様だったため、
OS 向けのパッケージや Docker を公式に行っていなかった経緯があります。
Caddy v2 のモジュールではこの問題を解決しているため、
公式パッケージ・公式 Docker が提供されるようになってきています。