
メモリ容量が512MBしかないSBCでウェブの提供を行おうとしたが、このホストはicecast2を動かしていて、既にメモリの80%以上を消費しているので、さらにPHPだとかPythonだとかを使ったCMSを動かすとかは無理そう。そこで別ホストのウェブサーバのコンテンツを表示させるリバースプロクシを建てることにした。
そのリバースプロクシにはいつも使っているNginxではなく軽量で簡単なCaddyを使うことにした。噂によるとHTTP/2には自動対応、つまりSSL/TLSの設定は自動。さらにHTTP/3のQUICも使えるとか。凄いね。
Caddyは初めて使うのでググったのだが、新旧情報が入り混じってて簡単な筈なのに意外と苦労することになった。
Caddy serverをインストール
Caddyを非商用で使う場合は https://caddyserver.com/download からバイナリファイルをダウンロード。ウェブ画面上部のPlatformの欄でCaddyを使用するホストのOSの種類とCPUの種類の合うものを選択して、右端の[Download]で取得できる。
ダウンロードしたファイル(今回はcaddy_linux_arm64)を/usr/bin/あたりに置く。ファイル名はcaddyにでもしておく。実行権限はダウンロードしたファイルに付いている筈だけど確認して無ければ付けておく。
インストールはこれだけ。
Caddyを触ってみる
$ caddy help
Caddy is an extensible server platform.
usage:
caddy <command> [<args...>]
commands:
adapt Adapts a configuration to Caddy's native JSON
build-info Prints information about this build
environ Prints the environment
file-server Spins up a production-ready file server
fmt Formats a Caddyfile
hash-password Hashes a password and writes base64
help Shows help for a Caddy subcommand
list-modules Lists the installed Caddy modules
reload Changes the config of the running Caddy instance
reverse-proxy A quick and production-ready reverse proxy
run Starts the Caddy process and blocks indefinitely
start Starts the Caddy process in the background and then returns
stop Gracefully stops a started Caddy process
trust Installs a CA certificate into local trust stores
untrust Untrusts a locally-trusted CA certificate
validate Tests whether a configuration file is valid
version Prints the version
Use 'caddy help <command>' for more information about a command.
Full documentation is available at:
https://caddyserver.com/docs/command-line
こんなコマンドが使えるみたい。
$ caddy version
v2.2.1 h1:Q62GWHMtztnvyRU+KPOpw6fNfeCD3SkwH7SfT1Tgt2c=
とりあえず、バージョンを確認しておく。Ver.1系とVer.2系で設定の書き方が全然違うみたいなので。今後はver.2系の情報だけ探すべき。
一応、公式のドキュメントは https://caddyserver.com/docs/ にあるのだが、個人的には読んでもピンとこなくて各項目で何が指定できるのかなんか良く解らなかった。
設定のサンプルをググるとVer.1系の情報が多くヒットして役に立たないだけでなく混乱するので困る。
Caddyをリバースプロキシにする
今回はCaddyをリバースプロクシにするのだが、先ずは設定ファイルを作らずにコマンドラインから1行で実行してみた。
$ caddy reverse-proxy --from caddy.example.com --to 192.168.0.1:443 または $ caddy reverse-proxy --from caddy.example.com --to https://another.example.com
caddy.example.comが、Caddyの動いているホストのFQDNとする。
192.168.0.1:443やhttps://another.example.comはコンテンツのある外部ウェブサーバ。ここのIPアドレスやURLの書き方を混ぜると挙動が怪しいようなので注意。特に接続先のホスト(another.example.com側)が名前ベースのバーチャルホストの場合にデフォルトサーバが表示されたりデフォルトサーバが指定されていない場合にFQDN順で最初にヒットするバーチャルホストのコンテンツが表示されたりすることになる。
なお、コンテンツ側のホストは基本的にHTTPSであること。HTTPのウェブサーバを指定するとおそらくNGになるかな?
上の簡単なコマンド1つで自動的に Let's EncryptからTLS証明書を取得してHTTPSサーバとして起動してくれる。なんて簡単なの。
自動で取得した証明書関係のファイルは ~/.local/share/caddy/certificates下に保存される。 ~ は実行ユーザーのホームディレクトリ。
curlでリバースプロキシに接続してレスポンスヘッダ(+コンテンツ本体)を調べてみる。
curl -i https://caddy.example.com
HTTP/2 200
accept-ranges: bytes
content-type: text/html
date: Mon, 16 Nov 2020 04:37:05 GMT
etag: "5fb11437-5b"
last-modified: Sun, 15 Nov 2020 11:42:47 GMT
server: Caddy
server: nginx
content-length: 20
another.example.com (コンテンツ)
簡単に動くのは素晴らしいのだけど、レスポンスヘッダにserver行が2つ(Caddyとnginx)あって気に入らない。ちなみにここで表示されているnginxはanother.example.comのウェブサーバが出したものを表示してるよう。とりあえずCaddy側を隠したいが、どうせ隠せるのであればserver行の存在自体が全部要らない。
そこで、設定ファイルでヘッダを操作する。
1 2 3 4 5 6 7 8 9 10 | caddy.example.com {
reverse_proxy {
to https://another.example.com
}
header / {
-Server
Strict-Transport-Security "max-age=31536000; includeSubDomains"
}
}
|
接続先のIPアドレス:ポートまたはURLの前の to は必要。
ついでにヘッダを追加する例としてHSTSを1行入れている。必須じゃないので気に入らないなら7行目を削除。
$ caddy start --config /etc/Caddyfile
startはバックグラウンドで実行。caddy stop で停止。フォアグランドで動かすならstartの代わりにrunを使う。
curl -i https://caddy.example.com
HTTP/2 200
accept-ranges: bytes
content-type: text/html
date: Mon, 16 Nov 2020 05:02:36 GMT
etag: "5fb11437-5b"
last-modified: Sun, 15 Nov 2020 11:42:47 GMT
strict-transport-security: max-age=31536000; includeSubDomains
content-length: 20
another.example.com (コンテンツ)
server行が消えて、追加したstrict-transport-security行がある。
一応満足。
メモリの使用量はNanoPi NEO2のArmbian(Debian Focal Fossa)で8MB程度(常駐のみ)、+α (処理時)。まぁ一応軽い。
今後、簡単にウェブサーバを建てたいと思ったら選択肢の1つ入れるかな。ただし、ドキュメントが何かイマイチ解らないのが問題かも。