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

  • 4
    いいね
  • 0
    コメント

:sunny: Caddy Web Server v0.10.1 以降に暫定的に対応しました。

概要

Mastodon では、多くの画像や絵文字のデータをクライアント・サーバ間でやり取りします。
そのため、HTTP/1.1 ではコネクションを多く消費し通信効率が悪くなります。
そこで、HTTP/2, さらにはQUICに対応したCaddy Web Serverを、リバースプロキシに使用します。
(Nginx でも、HTTP/2には対応します。詳しくは、ほかの人の記事を読んでください。)

Caddy Web Serverとは?

Let's EncryptとHTTP/2に標準対応していることが特徴の発展途上のウェブサーバです。
現在、バージョンは0.10.2となっています。
メールアドレスを設定ファイルに入力するだけで、Let's Encryptの証明書を自動で取得し使用してくれます。

利用方法

動作検証した環境

Mastodon tag v1.3.2
Caddy Web Server v0.10.2

Caddyのインストール

ここからダウンロードします。
ソースコードではなく、バイナリが直接ダウンロードできます。

$ cd ~
$ mkdir caddy
$ cd caddy
$ tar zxvf ../caddy_v0.10.0_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/ {

    root /home/mastodon/live/public
    gzip

    header / {
        Strict-Transport-Security "max-age=31536000;"
        Content-Security-Policy "style-src 'self' 'unsafe-inline'; script-src 'self'; object-src 'self'; img-src data: https:; media-src data: https:; connect-src 'self' wss://yourdomain.example.com; upgrade-insecure-requests"
    }

    header /assets Cache-Control "public, max-age=31536000, immutable"
    header /system/media_attachments/files Cache-Control "public, max-age=31536000, immutable"
    header /system/accounts/avatars 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}
    }

    rewrite / {
        if {path} has /api/v1/streaming
        to {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プロトコルの有効化を行いました。)

[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=root ; うちの環境では、rootでないと動かない。(お勧めしませんが)
Group=root

; 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.
ProtectHome=false ; mastodonの位置に合わせて、適宜Protectを無効にします。
; 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=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 をインストールしてみた