CentOs7 Caddyでwebサーバーを構築する

CentOs7 Caddyでwebサーバーを構築する

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`.

とりあえず、起動はできたようなのでブラウザから確認してみる。

なぜ定義されていないものが実行されるのかわからないが、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にログファイルが作成されていることが確認できる

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の証明書が適応されていることが確認できます

常時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の設定サンプル

こちらにたくさんサンプルあるので参考にして下さい。
※公式はこちら