Caddy

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

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

公式 Web サイトは Caddy v2 向けと Caddy v1 向けで分離しています。
Caddy 関連で検索する場合など、
Caddy v2・Caddy v1 どちらの記載か注意して参照して下さい。


公式・関連サイト


特徴

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

  • Let’s Encrypt SSL サーバ証明書を自動発行・更新し、容易に SSL を実現します。
    利用者は意識せずに SSL 化を実現します。
    有償発行された SSL 証明書を適用する事もできます。
  • 最新技術 HTTP/2・TLS 1.3 に対応し高速表示できます。
    設定により Zstandard gzip 圧縮、更に HTTP/3 対応も可能です。
  • 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 (v2)

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

Scoop (Windows パッケージ)

🎈 Scoop は Caddy に対応しています。
Caddy 2.0.0 の公開より Scoop のパッケージ管理は Caddy v2 へ更新されています。

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

scoop install caddy

Caddy v1

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

caddyserver/caddy tag v1.0.4 | GitHub

また公式サイトでは、次からダウンロードが可能です。

Download Caddy | Caddy (v1)

この時、Windows 以外の環境で使用する場合は、下にスクロールすると
ダウンロードの URL と bash からダウンロードする時の URL が記載されていて、
plugin・telemetry を選択によって表示が変化するようになっています。
目的の状態にしてダウンロードして下さい。

Plugin を実行ファイルに同梱できる仕様から、
Caddy v1 ではディストリビューション向けのパッケージ化をしていません。


Caddyfile

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

Caddy v2

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

example.net.eu.org

tls [email protected]
root * D:\Caddy\example.net.eu.org
encode zstd gzip
file_server

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

example.net.eu.org {
  tls [email protected]
  root * D:\Caddy\example.net.eu.org
  templates
  encode zstd gzip
  file_server
}

www.example.net.eu.org {
  tls [email protected]
  redir https://example.net.eu.org{uri}
}

blog.example.net.eu.org {
  tls [email protected]
  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 [email protected]
root D:\Caddy\example.net.eu.org
gzip
example.net.eu.org {
  tls [email protected]
  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 [email protected]
  redir https://example.net.eu.org{uri}
}

blog.example.net.eu.org {
  tls [email protected]
  gzip
  fastcgi / 127.0.0.1:9000 php
  on startup php-fpm7
}

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

caddyserver/examples | GitHub (Caddy v1)

一つ一つの詳細はドキュメントを参照して下さい。

Caddy User Guide | Caddy (v1)


Q&A

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.

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
}

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

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

🎈 Caddy を Google Cloud Run で動作させる。| ふうせん🎈 Fu-sen.

Fly で使用できますか?

サイト運営者が Fly での動作を確認できています。

🎈 Caddy v2 - Fly | ふうせん🎈 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
}

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

.htaccess は Apache 固有の機能です。
Caddy では Caddyfile に相当機能を追加して下さい。

WordPress を Caddy で動かせますか?

Example: WordPress | Caddy Forum

Caddy v2 では、 php_fastcgi を有効にした時、
該当ファイルがなければ index.php を参照する仕様になっています。
これはまさしく WordPress での理想的な .htaccess で記載される設定です。

同様に index.php を必ず実行する PHP 動作のフレームワークは
そのまま動作が期待できます。

もちろん Caddy v1 でも使用できます。
Google で検索してみると、記事がいろいろ出てくるでしょう。

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

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

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

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

Caddy はユーザーディレクトリや suEXEC に対応していません。
独自ドメインで PHP を使用しない動作であれば使えますが、
PHP も含める場合は権限に注意を要します。
また v2 では Perl・SSI は非対応な事にもご注意下さい。

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

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

Caddy v2 では モジュール(Modules)です。
フォーラムでモジュールが一覧されています。

List of Caddy 2 Modules | Caddy Forum

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 が提供されるようになってきています。