Mastodon では、多くの画像や絵文字のデータをクライアント・サーバ間でやり取りします。 そのため、HTTP/1.1 ではコネクションを多く消費し通信効率が悪くなります。 そこで、HTTP/2, さらにはQUICに対応したCaddy Web Serverを、リバースプロキシに使用します。 (Nginx でも、HTTP/2には対応します。詳しくは、ほかの人の記事を読んでください。)
Caddy Web Serverとは?
Let’s EncryptとHTTP/2に標準対応していることが特徴の発展途上のウェブサーバです。 現在、バージョンは0.10.8となっています。 メールアドレスを設定ファイルに入力するだけで、Let’s Encryptの証明書を自動で取得し使用してくれます。
利用方法
動作検証した環境
- Mastodon tag v1.6.0
- Caddy Web Server v0.10.8
- CentOS 7, Fedora 25/26
Caddyのインストール
ここからダウンロードします。 ソースコードではなく、バイナリが直接ダウンロードできます。
cd ~
mkdir caddy
cd caddy
tar zxvf ../caddy_v0.10.8_linux_amd64.tar.gz
sudo cp caddy /usr/local/bin/
sudo mkdir -p {/etc,/etc/ssl,/var/log}/caddy
Caddyfileの設定
設定ファイルを以下の場所に作成します。
sudo vi /etc/caddy/Caddyfile
内容は、これを参考に適宜パス, ドメイン, メールアドレスを変えてください。
https://yourdomain.example.com/ {
log / /var/log/caddy/mastodon.log "{combined}" {
rotate_age 90
}
root /home/mastodon/live/public
gzip
header / {
Strict-Transport-Security "max-age=31536000;"
}
header /emoji Cache-Control "public, max-age=31536000, immutable"
header /packs Cache-Control "public, max-age=31536000, immutable"
header /system/accounts/avatars Cache-Control "public, max-age=31536000, immutable"
header /system/media_attachments/files Cache-Control "public, max-age=31536000, immutable"
errors {
* 500.html
}
rewrite {
if {path} is /
to /proxy{path}
}
rewrite {
if {path} not_has /api/v1/streaming
to {path} /proxy{path}
}
proxy /proxy localhost:3000 {
without /proxy
transparent
websocket
}
proxy /api/v1/streaming localhost:4000 {
transparent
websocket
}
tls [email protected] {
protocols tls1.2
}
}
systemd に登録する
systemdの設定ファイルをテンプレートからコピーします。
sudo cp ./init/linux-systemd/caddy.service /etc/systemd/system/
内容を必要に応じて変更します。以下の例では、
- QUIC有効化
- ProtectHome無効化
- CapabilityBoundingSet=CAP_NET_BIND_SERVICEの設定
- AmbientCapabilities=CAP_NET_BIND_SERVICEの設定
[Unit]
Description=Caddy HTTP/2 web server
Documentation=https://caddyserver.com/docs
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
Restart=on-failure
StartLimitInterval=86400
StartLimitBurst=5
; User and group the process will run as.
User=www-data
Group=www-data
; Letsencrypt-issued certificates will be written to this directory.
Environment=CADDYPATH=/etc/ssl/caddy
; Always set "-root" to something safe in case it gets forgotten in the Caddyfile.
; QUICプロトコルをサポートさせるときには、"-quic"を付ける。
ExecStart=/usr/local/bin/caddy -quic -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp
ExecReload=/bin/kill -USR1 $MAINPID
; Limit the number of file descriptors; see `man systemd.exec` for more limit settings.
LimitNOFILE=1048576
; Unmodified caddy is not expected to use more than that.
LimitNPROC=64
; Use private /tmp and /var/tmp, which are discarded after caddy stops.
PrivateTmp=true
; Use a minimal /dev
PrivateDevices=true
; Hide /home, /root, and /run/user. Nobody will steal your SSH-keys.
; mastodonがホームディレクトリにある場合、ProtectHomeを無効にします。
ProtectHome=false
; Make /usr, /boot, /etc and possibly some more folders read-only.
ProtectSystem=full
; ... except /etc/ssl/caddy, because we want Letsencrypt-certificates there.
; This merely retains r/w access rights, it does not add any new. Must still be writable on the host!
ReadWriteDirectories=/etc/ssl/caddy
; The following additional security directives only work with systemd v229 or later.
; They further retrict privileges that can be gained by caddy. Uncomment if you like.
; Note that you may have to add capabilities required by any plugins in use.
; CapabilityBoundingSetとAmbientCapabilitiesを設定します。
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
;NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
ファイルを保存したら、以下のコマンドでサービス登録を行います。
systemctl enable caddy
systemctl start caddy