Mastodon の リバースプロキシに Caddy を使用する。

  • 7
    Like
  • 2
    Comment

概要

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 your@mail-address.example.com {
        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

参考にした情報元

Caddyをリバースプロキシにして、QUICでのWebページ配信を試みる。
For Mastodon Caddy Setting file. (Based on official Nginx configuration example)
Mastodon Production guide
Orange Pi Zero に Armbian をインストールしてみた