CentOS7でCaddyを使用してWebサイトをホストする方法
序章
Caddy は、使いやすさを念頭に置いて作成された新しいWebサーバーです。 迅速な開発サーバーとして使用できるほどシンプルで、実稼働環境で使用できるほど堅牢です。
直感的な構成ファイル、HTTP / 2サポート、および自動TLS暗号化を備えています。 HTTP / 2はHTTPプロトコルの新しいバージョンであり、複数のファイルを転送するための単一の接続と他の機能の中でヘッダー圧縮を使用することにより、Webサイトを高速化します。 TLSは、安全な接続を介して暗号化されたWebサイトを提供するために使用され、インターネットで広く採用されていますが、証明書を手動で取得してインストールするのは面倒なことがよくあります。
Caddyは、 Let's Encrypt と緊密に統合されています。これは、無料のTLS / SSL証明書を提供し、必要に応じて証明書を自動的に取得して更新する認証局です。 つまり、Caddyが提供するすべてのWebサイトは、追加の構成やアクションを必要とせずに、安全な接続を介して自動的に提供できます。
このチュートリアルでは、Caddyをインストールして構成します。 このチュートリアルに従うと、HTTP/2と安全なTLS接続を使用して提供されるシンプルなWebサイトができあがります。
前提条件
このチュートリアルに従うには、次のものが必要です。
- この初期サーバーセットアップチュートリアルでセットアップされた1台のCentOS7サーバー(sudo非rootユーザーを含む)。
- サーバーを指すように構成されたドメイン名。 これは、CaddyがWebサイトのSSL証明書を取得するために必要です。 適切なドメイン名を使用しないと、WebサイトはTLS暗号化で安全に提供されません。 DigitalOcean チュートリアルでホスト名を設定する方法に従って、ドメインをDigitalOceanドロップレットにポイントする方法を学ぶことができます。
- オプションで、
sudo yum install nano
とともにインストールされたnano
テキストエディタ。 CentOSにはデフォルトでvi
テキストエディタが付属していますが、nano
の方がユーザーフレンドリーです。
ステップ1—キャディバイナリのインストール
Caddyプロジェクトは、Caddyサーバーのバイナリファイルを取得してインストールするインストールスクリプトを提供します。 実行するには、次のように入力します。
curl -s https://getcaddy.com | bash
スクリプトを表示するには、ブラウザでhttps://getcaddy.com
にアクセスするか、実行する前にwget
またはcurl
でファイルをダウンロードします。
インストール中に、スクリプトはsudo
を使用して管理者権限を取得し、Caddyファイルをシステム全体のディレクトリに配置するため、パスワードの入力を求められる場合があります。
コマンド出力は次のようになります。
Caddy installation script outputDownloading Caddy for linux/amd64... https://caddyserver.com/download/linux/amd64?plugins= Extracting... Putting caddy in /usr/local/bin (may require password) [sudo] password for sammy: Caddy 0.10.2 Successfully installed
スクリプトが終了すると、Caddyバイナリがサーバーにインストールされ、使用できるようになります。 which
を使用してキャディバイナリが配置されていることを確認するには、それらの場所を確認します。
which caddy
コマンド出力には、キャディバイナリが/usr/local/bin/caddy
にあることが示されます。
Caddyは、インストール中にシステム全体の構成を作成せず、サービスとして自身をインストールしません。つまり、起動時に自動的に起動しません。 次のいくつかの手順では、Caddyで使用するユーザーアカウントを作成します。Caddyが機能してサービスファイルをインストールするために必要なファイルです。
ステップ2—キャディのユーザーとグループを作成する
最も人気のある2つのHTTPサーバーであるApacheとNginxは、システムパッケージからのインストール中に独自の非特権ユーザーを作成しますが、Caddyはそれを行いません。 セキュリティ上の理由から、スーパーユーザーroot
アカウントを使用して開始しないでください。 このステップでは、caddy
という名前の専用ユーザーを作成します。このユーザーは、Caddyの実行とそのファイルへのアクセスにのみ使用されます。
caddy
という名前のユーザーを作成するには、次のように入力します。
sudo adduser -r -d /var/www -s /sbin/nologin caddy
-r
スイッチは、新しく作成されたアカウントをいわゆるシステムアカウントにします。-d
スイッチは、このユーザーのホームディレクトリを示します。この場合、/var/www
になります。後で作成します。 権限のないユーザーは、システムシェルにログインしてアクセスできないようにする必要があります。これは、-s
スイッチで目的のシェルを/sbin/nologin
に設定することで確認できます。これは、システムログインを禁止するシステムコマンドです。 最後のパラメーターはユーザー名自体です。この場合はcaddy
です。
これで、Caddy Webサーバーのユーザーが利用可能になったら、次のステップでCaddy構成ファイルを保存するために必要なディレクトリーを構成できます。
ステップ3—必要なディレクトリを設定する
Caddyの自動TLSサポートとユニットファイル(次のステップでインストールします)は、特定のディレクトリとファイルが特定のアクセス許可で存在することを想定しています。 このステップでそれらすべてを作成します。
まず、メインのCaddyfile
を格納するディレクトリを作成します。これは、CaddyにどのWebサイトをどのように提供するかを指示する構成ファイルです。
sudo mkdir /etc/caddy
このディレクトリの所有者をrootユーザーに変更し、そのグループを www-data に変更して、Caddyがそれを読み取れるようにします。
sudo chown -R root:caddy /etc/caddy
このディレクトリに、後で編集する空のCaddyfile
を作成します。
sudo touch /etc/caddy/Caddyfile
/etc/ssl
に別のディレクトリを作成します。 Caddyは、Let'sEncryptから自動的に取得するSSL秘密鍵と証明書を保存するためにこれを必要とします。
sudo mkdir /etc/ssl/caddy
キャディは、証明書を取得するときにこのディレクトリに書き込める必要があるため、所有者をcaddyユーザーにします。 グループをrootのままにして、デフォルトから変更しないでください。
sudo chown -R caddy:root /etc/ssl/caddy
次に、他のユーザーのすべてのアクセス権を削除して、他のユーザーがこれらのファイルを読み取れないようにします。
sudo chmod 0770 /etc/ssl/caddy
作成する必要のある最後のディレクトリは、Webサイト自体が公開されるディレクトリです。 /var/www
を使用します。これは通常の方法であり、ApacheやNginxなどの他のWebサーバーを使用する場合のデフォルトのパスでもあります。
sudo mkdir /var/www
このディレクトリは、caddyが完全に所有している必要があります。
sudo chown caddy:caddy /var/www
これで、Caddyを実行するために必要な環境が準備されました。 次のステップでは、Caddyをシステムサービスとして構成し、システムブートで開始し、systemctl
で管理できるようにします。
ステップ4—システムサービスとしてのCaddyのインストール
Caddyはそれ自体をサービスとしてインストールしませんが、プロジェクトは公式のsystemdユニットファイルを提供します。 このファイルは、前の手順で設定したディレクトリ構造を想定しているため、構成が一致していることを確認してください。
公式のCaddyリポジトリからファイルをダウンロードします。 curl
コマンドに-o
パラメータを追加すると、ファイルが/etc/systemd/system/
ディレクトリに保存され、systemd
から見えるようになります。
sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service
先に進む前に、ファイルを少し変更して、特権のないcaddy
ユーザーを使用してサーバーを実行できるようにする必要があります。
vi
またはお気に入りのテキストエディタでファイルを開きましょう( vi の簡単な紹介です)
sudo vi /etc/systemd/system/caddy.service
そして、ユーザーアカウントとグループの指定を担当するフラグメントを見つけます。
/etc/systemd/system/caddy.service
; User and group the process will run as. User=www-data Group=www-data
次のように、両方の値をcaddy
に変更します。
/etc/systemd/system/caddy.service
; User and group the process will run as. User=caddy Group=caddy
ファイルを保存して閉じ、終了します。 これで、サービスファイルをインストールで使用できるようになりました。 systemd
に新しいサービスファイルを認識させます。
sudo systemctl daemon-reload
次に、Caddyが起動時に実行できるようにします。
sudo systemctl enable caddy.service
サービスのステータスを確認することで、サービスが正しくロードされ、起動時に開始できるようになっていることを確認できます。
sudo systemctl status caddy.service
出力は次のようになります。
Caddy service status output● caddy.service - Caddy HTTP/2 web server Loaded: loaded (/etc/systemd/system/caddy.service; enabled; vendor preset: disabled) Active: inactive (dead) Docs: https://caddyserver.com/docs
具体的には、サービスがロードおよび有効であると表示されますが、まだ実行されていません。 構成がまだ不完全であるため、サーバーはまだ起動しません。
これで、Caddyをシステムサービスとして構成しました。このサービスは、手動で実行しなくても、起動時に自動的に開始されます。 次に、ファイアウォールを通過するWebトラフィックを許可します。
ステップ5— HTTPおよびHTTPS接続を許可する(オプション)
新しいCentOS7サーバーの追加の推奨手順チュートリアルも実行し、ファイアウォールを使用している場合は、インターネットトラフィックをCaddyに渡すためにファイアウォールルールを手動で追加する必要があります。
CaddyはHTTPおよびHTTPSプロトコルを使用してWebサイトにサービスを提供するため、Caddyをインターネットから利用できるようにするには、適切なポートへのアクセスを許可する必要があります。
sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https sudo firewall-cmd --reload
3つのコマンドをすべて実行すると、次の成功メッセージが出力されます。
firewall-cmd outputsuccess
これにより、Caddyは訪問者に自由にWebサイトを提供できるようになります。 次のステップでは、サンプルWebページを作成し、Caddyfile
を更新して、Caddyのインストールをテストします。
ステップ6—テストWebページとCaddyfileを作成する
プレーンなHelloWorld!メッセージを表示する非常に単純なHTMLページを作成することから始めましょう。 このコマンドは、前に作成したWebサイトディレクトリにindex.html
ファイルを作成し、その中に1行のテキスト<h1>Hello World!</h1>
を入れます。
echo '<h1>Hello World!</h1>' | sudo tee /var/www/index.html
次に、Caddyfile
に記入します。 Caddyfile
は、最も単純な形式で、1つ以上のサーバーブロックで構成され、それぞれが単一のWebサイトの構成を定義します。 サーバーブロックはアドレス定義で始まり、中括弧が続きます。 中括弧の中に、そのWebサイトに適用する構成ディレクティブを含めることができます。
アドレス定義はprotocol://host:port
の形式で指定されます。 一部のフィールドを空白のままにすると、Caddyはそれ自体でいくつかのデフォルトを想定します。 たとえば、プロトコルを指定したがポートを指定しなかった場合、後者は自動的に導出されます(つまり、ポートは指定されません)。 ポート80
はHTTPを想定しており、ポート443
はHTTPSを想定しています)。 アドレス形式を管理する規則は、公式のCaddyfileドキュメントで詳細に説明されています。
vi
またはお好みのテキストエディタを使用して、手順2で作成したCaddyfile
を開きます。
sudo vi /etc/caddy/Caddyfile
次の内容を貼り付けます。
/ etc / caddy / Caddyfile
http:// { root /var/www gzip }
次に、ファイルを保存して終了します。 この特定のCaddyfile
が何をするかを説明しましょう。
ここでは、アドレス定義にhttp://
を使用しています。 これは、サーバーへの接続に使用されるドメイン名に関係なく、ポート80
にバインドし、プレーンHTTPプロトコル(TLS暗号化なし)を使用してすべての要求を処理する必要があることをCaddyに通知します。 これにより、サーバーのIPアドレスを使用してCaddyがホストしているWebサイトにアクセスできるようになります。
サーバーブロックの中括弧の中には、次の2つのディレクティブがあります。
root
ディレクティブは、Webサイトファイルの場所をCaddyに通知します。 この例では、テストページを作成したのは/var/www
です。gzip
ディレクティブは、Webサイトを高速化するためにGzip圧縮を使用するようにCaddyに指示します。 追加の構成は必要ありません。
構成ファイルの準備ができたら、Caddyサービスを開始します。
sudo systemctl start caddy
これで、Webサイトが機能するかどうかをテストできます。 このために、サーバーのパブリックIPアドレスを使用します。 サーバーのIPアドレスがわからない場合は、curl -4 icanhazip.com
で取得できます。 入手したら、お気に入りのブラウザでhttp://your_server_ip
にアクセスして、 Hello World!のWebサイトを表示してください。
これは、Caddyのインストールが正しく機能していることを意味します。 次のステップでは、Caddyの自動TLSサポートを使用してWebサイトへの安全な接続を有効にします。
ステップ7—自動TLSの構成
Caddyを他のWebサーバーと区別する主な機能の1つは、無料の認証局(CA)であるLet'sEncryptからTLS証明書を自動的に要求および更新する機能です。 さらに、安全な接続を介してWebサイトに自動的にサービスを提供するようにCaddyを設定すると、Caddyfile
を1行変更するだけで済みます。
Caddyは、構成されたすべてのサーバーブロックに対して安全なHTTPS接続を有効にし、サーバーブロックの構成によっていくつかの要件が満たされていることを前提として、必要な証明書を自動的に取得します。
TLSが機能するには、次の要件を満たす必要があります。
- キャディは、HTTPSのポート
443
に自分自身をバインドできる必要があり、インターネットから同じポートにアクセスできる必要があります。 - プロトコルをHTTPに設定したり、ポートを
80
に設定したり、TLSを明示的にオフにしたり、他の設定でオーバーライドしたりしないでください(例: サーバーブロックのtls
ディレクティブを使用)。 - ホスト名は有効なドメイン名である必要があります。 空にしたり、
localhost
またはIPアドレスに設定したりしないでください。 Let's Encryptは有効なドメイン名に対してのみ証明書を発行できるため、これが必要です。 - Caddyは、Let'sEncryptを使用したキーの回復に使用できる電子メールアドレスを知っている必要があります。
このチュートリアルを実行している場合、最初の要件はすでに満たされています。 ただし、現在のサーバーブロックアドレスは単純にhttp://
として構成され、暗号化やドメイン名のないプレーンなHTTPスキームを定義します。 また、証明書を要求するときにLet'sEncryptが必要とする電子メールアドレスをCaddyに提供していません。 構成でアドレスが指定されていない場合、Caddyは起動時にアドレスを要求します。 ただし、Caddyはシステムサービスとしてインストールされているため、起動時に質問することができず、正しく起動しません。
これを修正するには、Caddyfile
を開いて再度編集します。
sudo vi /etc/caddy/Caddyfile
まず、http://
のアドレス定義をドメインに置き換えます。 これにより、HTTPによって強制された安全でない接続が削除され、TLS証明書のドメイン名が提供されます。 次に、サーバーブロック内でtls
ディレクティブを使用して、Caddyに電子メールアドレスを提供します。
変更されたCaddyfile
は次のようになり、ドメインとメールアドレスが次のように置き換えられます。
/ etc / caddy / Caddyfile
example.com { root /var/www gzip tls [email protected] }
ファイルを保存して、エディターを終了します。 変更を適用するには、Caddyを再起動します。
sudo systemctl restart caddy
次に、ブラウザをhttps://example.com
に移動して、変更が正しく適用されたかどうかを確認します。 その場合は、 Hello World!ページをもう一度表示する必要があります。 今回は、URLを確認するか、URLバーのロック記号を確認することで、WebサイトがHTTPSで提供されていることを確認できます。
結論
これで、安全なTLS接続を介してWebサイトを適切に提供するようにCaddyを構成しました。 Let's Encryptから証明書を自動的に取得して更新し、新しいHTTP / 2プロトコルを使用して安全な接続を介してサイトにサービスを提供し、gzip圧縮を使用して読み込み時間を短縮します。
これは、Caddyを使い始めるための簡単な例です。 Caddyfile
のCaddy独自の機能と構成ディレクティブの詳細については、公式のCaddyドキュメントを参照してください。