caddyのwebサーバーの構築手順です。アクセスログやエラーログの設定、常時https化までの手順を記載してます。起動時に少し問題ありましたが、簡単に常時https化が実現できます。
環境
- OS CentOS Linux release 7.7.1908 (Core)
- サーバー さくらのクラウド
- Caddy 1.0.3
パッケージのアップデート
まずアップデートから行う
## アップデート
sudo yum -y update
Caddyインストール
curlでインストールを行う
## インストール
sudo curl https://getcaddy.com | bash -s personal
## 確認
which caddy
<出力結果>
/usr/local/bin/caddy
ユーザーの作成
ユーザーと必要なディレクトリを作成していく
## ユーザーcaddyを作成
sudo adduser -r -d /var/www -s /sbin/nologin caddy
## ディレクトリの作成と権限の設定
sudo mkdir /etc/caddy
sudo chown -R root:caddy /etc/caddy
sudo mkdir /etc/ssl/caddy
sudo chown -R caddy /etc/ssl/caddy
sudo chmod 0770 /etc/ssl/caddy
sudo mkdir /var/www
sudo chown caddy:caddy /var/www
Caddy.serviceをダウンロードする
## ダウンロード
sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service
## ファイル編集
sudo vi /etc/systemd/system/caddy.service
caddy.serviceの変更箇所は下記
User=www-data
Group=www-data
↓ 下記に変更
User=caddy
Group=caddy
設定ファイルの再読込を行う
## 設定ファイルの再読込
sudo systemctl daemon-reload
## 自動起動
sudo systemctl enable caddy
## 確認
sudo systemctl status caddy
Caddyfile編集
## 編集
sudo vi /etc/caddy/Caddyfile
<編集>
http://ドメイン名 {
root /var/www
gzip
}
確認用のhtmlを作成しておく
## index.htmlを作成
echo '<h1>Hello World</h1>' | sudo tee /var/www/index.html
Caddy起動
caddyを起動してみる。まずはfirewall設定を変更
## firewall設定
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
caddy起動
## 起動
systemctl start caddy
<出力結果>
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to manage system services or units.
Authenticating as: root
Password:rootのパスを入力
==== AUTHENTICATION COMPLETE ===
## 確認
systemctl status caddy
● caddy.service - Caddy HTTP/2 web server
Loaded: loaded (/etc/systemd/system/caddy.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since 木 2019-11-07 11:08:01 JST; 7s ago
Docs: https://caddyserver.com/docs
Process: 6948 ExecStart=/usr/local/bin/caddy -log stdout -log-timestamps=false -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp (code=exited, status=2)
Main PID: 6948 (code=exited, status=2)
systemd[1]: Started Caddy HTTP/2 web server.
systemd[1]: caddy.service: main process exited, code=exited, status=2/INVALIDARGUMENT
systemd[1]: Unit caddy.service entered failed state.
systemd[1]: caddy.service failed.
起動してない。エラーを見ると-log-timestamps が怪しいので、/usr/local/bin/caddyを実行してみる
## 実行
/usr/local/bin/caddy -log stdout -log-timestamps=false -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp
<出力結果>
flag provided but not defined: -log-timestamps
-log-timestampsが定義されていない。-log-timestampsなしで実行してみる
## -log-timestampsなしで実行
/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp
<出力結果>
Activating privacy features... done.
Serving HTTP on port 80
http://ドメイン名
[INFO][cache:0xc0000aa5a0] Started certificate maintenance routine
[INFO] Serving http://ドメイン名
WARNING: File descriptor limit 1024 is too low for production servers. At least 8192 is recommended. Fix with `ulimit -n 8192`.
とりあえず、起動はできたようなのでブラウザから確認してみる。
Clik here to view.

なぜ定義されていないものが実行されるのかわからないが、caddy.serviceを編集しておく
## 編集
sudo vi /etc/systemd/system/caddy.service
既存をコメントアウトして、下記のように編集
; ExecStart=/usr/local/bin/caddy -log stdout -log-timestamps=false -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp
ExecStart=/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp
設定を反映させる
## 設定反映
sudo systemctl daemon-reload
## 実行
systemctl start caddy
## 確認
systemctl status caddy
<出力結果>
● caddy.service - Caddy HTTP/2 web server
Loaded: loaded (/etc/systemd/system/caddy.service; enabled; vendor preset: disabled)
Active: active (running) since 木 2019-11-07 11:33:13 JST; 3s ago
Docs: https://caddyserver.com/docs
Main PID: 7099 (caddy)
CGroup: /system.slice/caddy.service
└─7099 /usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp
active (running)になっていることが確認できました
アクセスログとエラーログの設定
アクセスログとエラーログを指定したディレクトリに出力する
## 編集
sudo vi /etc/caddy/Caddyfile
Caddyfileを下記のように編集する
http://ドメイン名 {
root /var/www
gzip
log /var/log/caddy/cady-accesslog {
rotate_size 50
rotate_age 5
rotate_keep 4
rotate_compress
}
errors /var/log/caddy/caddy-errors {
rotate_size 50
rotate_age 5
rotate_keep 4
rotate_compress
}
}
ディレクトリを作成する
sudo mkdir /var/log/caddy
sudo chown caddy:caddy /var/log/caddy
caddyを再起動して確認する
## 再起動
systemctl restart caddy
/var/log/caddyにログファイルが作成されていることが確認できる
Clik here to view.

https化
httpsでアクセス可能に設定する
## 編集
sudo vi /etc/caddy/Caddyfile
下記のようにhttpからドメイン名だけに変更し、tlsを追加する
ドメイン名 {
root /var/www
gzip
tls メールアドレス
log /var/log/caddy/cady-accesslog {
rotate_size 50
rotate_age 5
rotate_keep 4
rotate_compress
}
errors /var/log/caddy/caddy-errors {
rotate_size 50
rotate_age 5
rotate_keep 4
rotate_compress
}
}
設定を反映
## 再起動
systemctl restart caddy
## 確認
systemctl status caddy
<出力結果>
systemd[1]: Started Caddy HTTP/2 web server.
caddy[7233]: Activating privacy features... 2019/11/07 12:17:22 [INFO][cache:0xc0000a6690] Started cert... routine
caddy[7233]: done.
caddy[7233]: Serving HTTPS on port 443
caddy[7233]: https://ドメイン名
caddy[7233]: 2019/11/07 12:17:22 [INFO] Serving https://ドメイン名
caddy[7233]: Serving HTTP on port 80
caddy[7233]: http://ドメイン名
httpsでブラウザからアクセスしてみると、Let’s Encryptの証明書が適応されていることが確認できます
Clik here to view.

常時SSL化
最後に常時SSL化の設定を行う
## 編集
sudo vi /etc/caddy/Caddyfile
redirを追加する
ドメイン名 {
root /var/www
gzip
tls メールアドレス
log /var/log/caddy/cady-accesslog {
rotate_size 50
rotate_age 5
rotate_keep 4
rotate_compress
}
errors /var/log/caddy/caddy-errors {
rotate_size 50
rotate_age 5
rotate_keep 4
rotate_compress
}
redir {
if {scheme} is http
/ https://{host}{uri}
}
}
後は再起動すればhttpでアクセスしてもhttpsで接続されるようになります。
Caddyfileの設定サンプル
こちらにたくさんサンプルあるので参考にして下さい。
※公式はこちら