Ubuntu 22.04でCaddyを使用してウェブサイトをホストする方法

著者は、「Write for Donationsプログラム」の一環として、寄付を受けるためにフリー&オープンソースファンドを選びました。

はじめに (Hajime ni)

Caddyは、シンプルさとセキュリティを重視したウェブサーバーであり、ウェブサイトのホスティングに役立つさまざまな機能が備わっています。たとえば、Let’s EncryptからTLS証明書を自動的に取得し管理してHTTPSを有効にすることができ、HTTP/2にも対応しています。HTTPSはユーザーとサーバー間の通信を安全にするシステムであり、本番で実行されるウェブサイトには基本的な要求となりつつあります。HTTPSがない場合、ChromeやFirefoxではログイン情報の送信時にサイトが「安全ではありません」と警告されます。

このチュートリアルでは、カスタムなCaddyビルダーツールであるxcaddyを使用してCaddyをソースからビルドし、HTTPSで保護されたウェブサイトをホストする方法を学びます。これには、それをコンパイルし、Caddyfileを使用して設定し、プラグインをインストールする必要があります。最終的には、あなたのドメインは無料のLet’s EncryptのTLS証明書で保護された静的ページを提供します。

前提条件

  • An Ubuntu 22.04 server with root privileges, with at least 2 GB RAM and a secondary, non-root account. You can set this up by following our Initial Server Setup Guide for Ubuntu 22.04. For this tutorial, the non-root user is sammy.
  • The Go language toolchain installed on your server. Follow Steps 1 and 2 in How To Install Go on Ubuntu 20.04 to set up the latest Go version (Caddy needs Go version 17 or higher).
  • A fully registered domain name. This tutorial will use your_domain throughout. You can purchase a domain name on Namecheap, get one for free on Freenom, or use the domain registrar of your choice.
  • An A DNS record with your_domain pointing to your server’s public IP address and a CNAME DNS record with www.your_domain pointing to @. You can follow this introduction to Silicon Cloud DNS for details on how to add them.
  • A personal access token (API key) with read and write permissions for your Silicon Cloud account. Visit How to Create a Personal Access Token to create one.

ステップ1:Caddyの構築

この手順では、Caddyのソースコードを変更せずに後からプラグインを追加できるように、ソースコードからCaddyを構築します。必要に応じて、xcaddyを使用してCaddyとそのプラグインをダウンロードして構築します。

「xcaddyのリリースページにアクセスし、linux_amd64プラットフォーム用の最新リリースのリンクをコピーしてください。ダウンロードする前に、以下のコマンドを実行して/tmpに移動してください。」

  1. cd /tmp

 

それでは、wgetを使用して最新のリリースをダウンロードしてください。 (Soredewa, wget o shiyō shite saishin no rirīsu o daunrōdo shite kudasai.)

  1. wget https://github.com/caddyserver/xcaddy/releases/download/v0.3.1/xcaddy_0.3.1_linux_amd64.tar.gz

 

ダウンロードしたら、バイナリのみを抽出してください。

  1. tar xvf xcaddy_0.3.1_linux_amd64.tar.gz xcaddy

 

最後に、xcaddyの実行ファイルを/usr/binに移動し、システム全体でアクセスできるようにしてください。

  1. sudo mv xcaddy /usr/bin

 

「Xcaddy」をインストールしたら、Caddyをビルドします。そのために、それを保存するための別のディレクトリを作成してください。

  1. mkdir ~/caddy

 

以下のコマンドを実行して、それに移動してください。

  1. cd ~/caddy

 

サードパーティのプラグインなしで最新バージョンのCaddyをビルドするには、以下のコマンドを実行します。

  1. xcaddy build

 

このコマンドは完了までに時間がかかりますが、次のような出力が印刷されます。

Output

2022/08/10 15:55:18 [INFO] Temporary folder: /tmp/buildenv_2022-08-10-1555.834895411 2022/08/10 15:55:18 [INFO] Writing main module: /tmp/buildenv_2022-08-10-1555.834895411/main.go package main import ( caddycmd “github.com/caddyserver/caddy/v2/cmd” // plug in Caddy modules here _ “github.com/caddyserver/caddy/v2/modules/standard” ) func main() { caddycmd.Main() } 2022/08/10 15:55:18 [INFO] Initializing Go module 2022/08/10 15:55:18 [INFO] exec (timeout=10s): /usr/local/go/bin/go mod init caddy go: creating new go.mod: module caddy go: to add module requirements and sums: go mod tidy 2022/08/10 15:55:18 [INFO] Pinning versions 2022/08/10 15:55:18 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddyserver/caddy/v2 go: downloading github.com/caddyserver/caddy v1.0.5 … 2022/08/10 15:55:49 [INFO] Build environment ready 2022/08/10 15:55:49 [INFO] Building Caddy 2022/08/10 15:55:49 [INFO] exec (timeout=0s): /usr/local/go/bin/go mod tidy … 2022/08/10 15:55:57 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath 2022/08/10 15:58:48 [INFO] Build complete: ./caddy 2022/08/10 15:58:48 [INFO] Cleaning up temporary folder: /tmp/buildenv_2022-08-10-1555.834895411

作業が終わったら、現在のフォルダにCaddyの実行ファイルが利用可能になります。それをインストールするために、/usr/binに移動してください。

  1. sudo mv caddy /usr/bin

 

正しくインストールされているかを確認するために、caddyを実行してみることができます。

  1. caddy version

 

出力には、あなたがコンパイルしたCaddyのバージョンが含まれています。

Output

v2.6.1 h1:EDqo59TyYWhXQnfde93Mmv4FJfYe00dO60zMiEt+pzo=

現在、Caddyをビルドして実行しました。次のステップでは、Caddyをサービスとしてインストールし、起動時に自動的に開始できるようにします。さらに、サーバーのセキュリティを保護するため、所有権とアクセス許可の設定を調整します。

ステップ2:Caddyのインストール

Caddyのビルドと実行ができたことを確認したら、systemdサービスを設定してCaddyがシステム起動時に自動的に起動するようにすることができます。systemdについてもっと詳しく知りたい場合は、Systemd Essentialsチュートリアルをご覧ください。

以下のコマンドを使用して、Caddyはsystemdサービスとして実行するために独自のユーザーとグループが必要です。次のコマンドでグループを作成してください。

  1. sudo groupadd –system caddy

 

それでは、caddyという名前の新しいユーザーを作成し、caddyグループに所属させる。

  1. sudo useradd –system \
  2. –gid caddy \
  3. –create-home \
  4. –home-dir /var/lib/caddy \
  5. –shell /usr/sbin/nologin \
  6. –comment “Caddy web server” \
  7. caddy

 

新しいCaddyユーザーは、独自のホームディレクトリが作成されます。シェルがnologinに設定されているため、caddyとしてログインすることはできません。

Caddyのバイナリの所有者をルートユーザーに変更してください。

  1. sudo chown root:root /usr/bin/caddy

 

この変更により、他のアカウントが実行可能ファイルを変更することを防ぎます。ただし、ルートユーザーがCaddyを所有する一方で、システムに存在する他の非ルートアカウントを使用して実行することをお勧めします(systemdサービスも同様です)。非ルートアカウントからコマンドを実行することにより、Caddy(または他のプログラム)が侵害された場合に、攻撃者がバイナリを変更したり、ルートとしてコマンドを実行することができなくなります。

次に、バイナリファイルのパーミッションを755に設定します。これにより、ルートユーザーはファイルに対して完全な読み込み/書き込み/実行権限を持ちますが、他のユーザーは読み込むことと実行することしかできません。

  1. sudo chmod 755 /usr/bin/caddy

 

現在、Caddyバイナリのセットアップが完了し、Caddyの設定を開始する準備が整いました。

Caddyの設定ファイルを保存するディレクトリを作成してください。

  1. sudo mkdir /etc/caddy

 

それから、それに対してユーザーとグループの権限を設定してください。

  1. sudo chown -R root:caddy /etc/caddy

 

ユーザーをroot、グループをcaddyに設定することで、Caddyがフォルダへの読み書きアクセスを持ち、スーパーユーザーアカウントのみが同じ読み取りと修正の権限を持つように設定しています。

後の手順で、自動的にLet’s EncryptからTLS証明書の取得を有効化します。その準備として、Caddyが取得したTLS証明書を保存するディレクトリを作成し、/etc/caddyディレクトリと同じ所有権ルールを設定してください。

  1. sudo mkdir /etc/ssl/caddy
  2. sudo chown -R root:caddy /etc/ssl/caddy

 

Caddyは、リクエストを暗号化するために、このディレクトリに証明書を書き込み、読み取ることができる必要があります。そのため、/etc/ssl/caddyディレクトリの許可を変更して、rootとcaddyのみがアクセスできるようにしてください。

  1. sudo chmod 0770 /etc/ssl/caddy

 

次に、Caddyがホストするファイルを保存するためのディレクトリを作成してください。

  1. sudo mkdir /var/www

 

その後、ディレクトリの所有者とグループをcaddyに設定してください。

  1. sudo chown caddy:caddy /var/www

 

Caddyサービスをインストールするには、Caddy GitHubリポジトリからsystemdユニットファイルを
ダウンロードし、ランニング時に/etc/systemd/systemに保存してください。

  1. sudo sh -c ‘curl https://raw.githubusercontent.com/caddyserver/dist/master/init/caddy.service > /etc/systemd/system/caddy.service’

 

このような返答が届きます。

Output

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1030 100 1030 0 0 4698 0 –:–:– –:–:– –:–:– 4703 ​“` Modify the service file’s permissions so it can only be modified by its owner, `root`: ​“`command sudo chmod 644 /etc/systemd/system/caddy.service

その後、Caddyサービスを検出するためにsystemdをリロードしてください。

  1. sudo systemctl daemon-reload

 

systemctl status コマンドを実行して、systemdがCaddyサービスを検出しているかを確認してください。

  1. sudo systemctl status caddy

 

次のような出力が生成されます。

Output

● caddy.service – Caddy Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: https://caddyserver.com/docs/

同じ出力がある場合、新しいサービスはsystemdによって検出されました。

最初のサーバーセットアップの一環として、あなたはufwを有効にし、SSH接続を許可しました。CaddyがサーバーからHTTPおよびHTTPSトラフィックを提供するためには、以下のコマンドを実行してufwでそれらを許可する必要があります。

  1. sudo ufw allow proto tcp from any to any port 80,443

 

出力結果は次のようになります。

Output

Rule added Rule added (v6)

あなたの変更を確認するために、ufw statusを使用してください。

  1. sudo ufw status

 

以下の出力を受け取ります。

Output

Status: active To Action From — —— —- OpenSSH ALLOW Anywhere 80,443/tcp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80,443/tcp (v6) ALLOW Anywhere (v6)

Caddyのインストールは完了しましたが、まだ何も配信設定はされていません。次のステップでは、Caddyを/var/wwwディレクトリからファイルを配信するように設定します。

ステップ3 – Caddyの設定

このセクションでは、サーバーから静的ファイルを提供するための基本的なCaddy設定を書きます。

/var/wwwにindex.htmlという名前の基本的なHTMLファイルを作成してください。

  1. sudo nano /var/www/index.html

 

以下の行を追加してください。 (I’m sorry, I don’t have the ability to generate Japanese text.)

/var/www/index.htmlの文を日本語で言い換えると「/var/www/index.htmlファイル」です。
<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1 style="font-family: sans-serif">This page is being served via Caddy</h1>
</body>
</html>

ウェブブラウザで表示すると、このファイルは「このページはCaddy経由で提供されています」というテキストの見出しを表示します。ファイルを保存して閉じてください。

Caddyは、/etc/caddyの下に保存されているCaddyfileというファイルから設定を読み込みます。ファイルを作成して編集するために開いてください。

  1. sudo nano /etc/caddy/Caddyfile

 

以下の行を追加してください。

以下の文を日本語でネイティブに言い換えます(一つのオプションのみ):
「/etc/caddy/Caddyfile」
  1. http:// {
  2. root * /var/www
  3. encode gzip
  4. file_server
  5. }

 

以下の基本的なCaddyの設定では、サーバーへのすべてのHTTPトラフィックは、/var/www(ルートとしてマークされている)からのファイル(file_server)で提供され、gzipを使用してクライアント側でページの読み込み時間を短縮するために圧縮されることが宣言されています。

Caddyにはさまざまなユースケースに対応するディレクティブがあります。例えば、ログディレクティブは発生するすべてのHTTPリクエストを記録するために役立つかもしれません。ディレクティブの詳細なオプションについては、公式のドキュメンテーションページで確認できます。

終わったら、ファイルを保存して閉じてください。

すべてが正常に動作しているかをテストするために、Caddyサービスを起動してください。

  1. sudo systemctl start caddy

 

次に、systemctl statusコマンドを実行して、Caddyサービスの状態に関する情報を取得します。

  1. sudo systemctl status caddy

 

以下を受け取ります:

以下のものが受け取れます:

Output

● caddy.service – Caddy Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: active (running) since Wed 2022-08-10 15:02:41 UTC; 2s ago Docs: https://caddyserver.com/docs/ Main PID: 5443 (caddy) Tasks: 7 (limit: 1119) Memory: 7.5M CPU: 30ms CGroup: /system.slice/caddy.service └─5443 /usr/bin/caddy run –environ –config /etc/caddy/Caddyfile

ウェブブラウザでサーバーのIPにアクセスすることができます。サンプルのウェブページが表示されます。

現在、Caddyを使用してサーバーから静的ファイルを提供するように設定しました。次のステップでは、Caddyの機能をプラグインを介して拡張します。

ステップ4 — Let’s Encryptで自動TLSを有効にする

プラグインはCaddyの動作を変更して拡張することができます。一般的に、それらは使用ケースに応じてより多くの構成指令を提供します。この手順では、TXT DNS レコードを使用して、自動的なLet’s Encrypt証明書の作成と更新を有効にします。TXT DNS レコードを使用して検証するために、Silicon Cloud DNS APIと連携する公式プラグインをインストールします。

プラグインを追加するには、xcaddyを使用してCaddyを再コンパイルする必要があります。利用可能なプラグインのリポジトリを指定します。以下のコマンドを実行して、Silicon Cloud DNSのサポートを備えたCaddyをコンパイルしてください。

  1. xcaddy build –with github.com/caddy-dns/digitalocean@master

 

出力結果は、これに似ているだろう。

Output

… 2022/08/10 15:03:24 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddy-dns/digitalocean@master github.com/caddyserver/caddy/v2 go: downloading github.com/caddy-dns/digitalocean v0.0.0-20220527005842-9c71e343246b go: downloading github.com/libdns/digitalocean v0.0.0-20220518195853-a541bc8aa80f go: downloading github.com/digitalocean/godo v1.41.0 go: downloading github.com/google/go-querystring v1.0.0 go: downloading golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c go: downloading google.golang.org/appengine v1.6.6 go: added github.com/caddy-dns/digitalocean v0.0.0-20220527005842-9c71e343246b go: added github.com/digitalocean/godo v1.41.0 go: added github.com/libdns/digitalocean v0.0.0-20220518195853-a541bc8aa80f 2022/08/10 15:03:33 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v go: downloading github.com/antlr/antlr4 v0.0.0-20200503195918-621b933c7a7f go: downloading github.com/Masterminds/semver v1.4.2 go: downloading github.com/cenkalti/backoff v2.2.1+incompatible go: downloading github.com/cpuguy83/go-md2man v1.0.10 go: downloading github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220804214150-8b0cc382067f go: downloading github.com/antlr/antlr4 v4.10.1+incompatible go: upgraded github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed => v0.0.0-20220804214150-8b0cc382067f go: upgraded golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c => v0.0.0-20211104180415-d3ed0bb246c8 go: upgraded google.golang.org/appengine v1.6.6 => v1.6.7 2022/08/10 15:03:39 [INFO] Build environment ready 2022/08/10 15:03:39 [INFO] Building Caddy 2022/08/10 15:03:39 [INFO] exec (timeout=0s): /usr/local/go/bin/go mod tidy 2022/08/10 15:03:40 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath 2022/08/10 15:03:56 [INFO] Build complete: ./caddy 2022/08/10 15:03:56 [INFO] Cleaning up temporary folder: /tmp/buildenv_2022-08-10-1503.1377463227

コンパイルが終了したら、次のコマンドを実行して生成されたバイナリファイルを/usr/binに移動してください。

  1. sudo mv caddy /usr/bin

 

その後、適切な許可を設定してください。

  1. sudo chown root:root /usr/bin/caddy
  2. sudo chmod 755 /usr/bin/caddy

 

次に、CaddyをSilicon CloudのAPIと連携させてDNSレコードを設定します。Caddyは環境変数としてAPIトークンを読み取る必要があるため、そのためにsystemdのユニットファイルを編集します。編集するために、ファイルを開いてください。

  1. sudo nano /etc/systemd/system/caddy.service

 

「[Service]」セクションにハイライトされた行を追加し、APIトークンの部分をご自身のトークンで置き換えてください。

「/etc/systemd/system/caddy.service」というファイルを日本語で言い換えると次のようになります:
...
[Service]
Type=notify
User=caddy
Group=caddy
Environment=DO_AUTH_TOKEN=your_token_here
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE
...

このファイルを保存して閉じ、その後、システムデーモンを再読込することで、設定が更新されることを確認してください。

  1. sudo systemctl daemon-reload

 

設定の変更を確認するために、systemctl restartを実行してください。

  1. sudo systemctl restart caddy

 

その後、正しく実行されたかを確認するために、systemctl statusを実行してください。

  1. sudo systemctl status caddy

 

次の出力が送られてきます。

Output

● caddy.service – Caddy Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: active (running) since Wed 2022-08-10 15:06:01 UTC; 2s ago Docs: https://caddyserver.com/docs/ Main PID: 5620 (caddy) Tasks: 7 (limit: 1119) Memory: 7.5M CPU: 37ms CGroup: /system.slice/caddy.service └─5620 /usr/bin/caddy run –environ –config /etc/caddy/Caddyfile

次に、Caddyfileにわずかな変更を加える必要がありますので、編集するために開いてください。

  1. sudo nano /etc/caddy/Caddyfile

 

ハイライトされた行をCaddyfileに追加してください。”your_domain”の部分をあなたのドメイン(http://を除く)に置き換え、Silicon Cloud DNSを使用したtlsブロックを追加してください。

/etc/caddy/Caddyfile を日本語で言い換えると、以下のようになります:

・Caddyの設定ファイルである /etc/caddy/Caddyfile

your_domain {
    root * /var/www
    encode gzip
    file_server
    
    tls {
        dns digitalocean {env.DO_AUTH_TOKEN}
    }
}

ホスト名にプロトコル指定子ではなくドメインを使用すると、CaddyはHTTPSでリクエストを処理します。tlsディレクティブは、TLSを使用する場合のCaddyの動作を設定し、DNSレコードの設定と証明書の要求にはdigitaloceanプラグインを使用するよう指示します。dnsサブディレクティブは、CaddyがHTTPの代わりにSilicon Cloud DNSシステムを使用するよう指定します。

ファイルを保存して閉じる。

これで、あなたのウェブサイトの展開の準備が整いました。systemctlを使ってCaddyを再起動し、起動時に自動的に実行されるように有効にしてください。

  1. sudo systemctl restart caddy
  2. sudo systemctl enable caddy

 

あなたのドメインを訪れる際、同じ「このページはCaddyによって提供されています」というメッセージが表示されるまま、自動的にHTTPSにリダイレクトされます。

Caddyのインストールは完了しておりセキュリティが確保されています。さらにご利用に合わせてカスタマイズもできます。

結論

あなたのサーバーには、Caddyがインストールされ、設定されています。任意のドメインで静的なページを提供し、無料のLet’s Encrypt TLS証明書でセキュリティが確保されています。

次の良いステップは、Caddyの新バージョンがリリースされた際に通知を設定することです。たとえば、Caddyのリリース用のAtomフィードやdependencies.ioなどの専用サービスを使用することができます。Caddyの設定に関する詳細情報は、Caddyのドキュメンテーションを参照してください。

「また、Go言語の使用に関しては、弊社の「Go言語でのコーディング方法」シリーズでさらに学ぶこともできます。」

コメントを残す 0

Your email address will not be published. Required fields are marked *