Caddy ウェブサーバー

Caddy
©いらすとや.

メモリ容量が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行の存在自体が全部要らない。
そこで、設定ファイルでヘッダを操作する。

/etc/Caddyfile (新規作成)
 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行目を削除。

作成した/etc/Caddyfileを指定してcaddyを実行する。
$ 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つ入れるかな。ただし、ドキュメントが何かイマイチ解らないのが問題かも。

パルスオキシメーター

中国の通販サイトBanggoodでは、Snatch(スナッチ)という実質的なプレゼントイベントを基本的に3日毎に実施している。
一応、抽選で当選者が決まるのだが、普通の抽選とは違い賞品毎に決められた人数を集めて共有の商品リンクで仮注文し、成立したグループの全員が抽選に参加できるというもの。つまり、グループを作らないと抽選に参加できないので少しハードルが高い。だから、誰でもいくらでも参加できるプレゼントより抽選に当選する確率が高くなる。このSnatchについてはSnatchグループ作成を支援するためのページを「悪いインターネット」に置いているのでご利用いただければと。他に5chとか。

普段クジ運の悪い「がとらぼ」の中の人が、そのSnatchでパルスオキシメーターに当選して賞品が送られてきたので簡単にレビュー。

パルスオキシメーターというのは日本人の発明だし、ドラッグストアを含めあちこちで「ご自由にお使い下さい」で置いてあるものなので説明は不要かと。

Oximeter 1
届いたパッケージ。AliExpressは日本でいえば楽天のようなシステムなので商品を販売するショップごとに好き勝手な梱包で送る方式だけど、Banggoodはアマゾン的なシステムなのでBanggood.comの袋に入って送られてきた。

Oximeter 2
袋の中身。特に緩衝材などは入っていなかったが、中国から送られてきた割には潰れていない。

Oximeter 3
箱の中身。
オキシメーター本体が中央にあり、手前に見えている紐はストラップらしい。

Oximeter 4
箱の中身のすべて。左がオキシメーター本体。中央上段が説明書。下段が(中国の規格の?)「適合証明書」。右がストラップ。
説明書は5ヶ国語で書かれているが、英独仏西伊なので日本語はない。

Oximeter 5
本体の裏面。底面部分を左から右に滑らすとフタが開く。

Oximeter 6
中に入れるのはAAA電池が2本。AAAは日本の規格だと単4電池のこと。電池は付属しないが、AAA電池なら多くの家に備蓄があるハズ。
国際規格のLR03(アルカリ電池)、R03(マンガン電池)のように分かれていればよいのだけどアメリカ式のAAAだとアルカリ電池なのかマンガン電池なのか判らない。説明書にも書いてなさそうなのでどちらでも良いのかな。

Oximeter 7
表の黒い面にボタンが1つ。操作はすべてこのボタン。
軽く1度押すと電源が入る。 今回は設定画面を出すので電源オフの状態からボタンを3秒長押しするか、電源オンの状態で1.5秒長押しをする。
Settings画面が表示された状態でボタンを軽く押すと「*」が移動する。その*が付いている行が選択されている状態になる。その状態でボタンを1.5秒長押しすると選択中の設定の変更になる。
設定の変更が完了したら15秒間放置するか一番下の行の「Exit」に合わせて1.5秒長押しする。
今回は写真撮影のためにDemoモードをオンにした。Demoモードでは非設定画面で「計測中」のような画面を表示する。

Oximeter 8
Demoモードで撮影した「計測中」を模した画面。左の98(パーセント)がSpO2で「経皮的動脈血酸素飽和度」で、動脈中のヘモグロビンで酸素を運んでいる割合。96%以上が正常らしい。
右の80はPR (pulse rate)で脈拍。単位がbpm (beats per minute)なので1分あたりの脈拍数。
この写真では横向き表示にしている。

Oximeter 9
ボタンを軽く押すと表示の向きが変わる。向きの違いを含め6通りの表示がボタンを押す毎に切り替わる。

Oximeter 10
付属のストラップは本体の穴に通して取り付ける。紐は少し通しにくいけど指をにじりながら穴の中に紐を送り込むようにするとピョコっと反対の穴から出てくる。
まぁ家庭での使用ならストラップは無くても良いんじゃないかな。正直邪魔だし。

Oximeter 11
この写真はデモモードではなく、本当に計測しているもの。
人差し指を奥の壁に当たるところまで差し込んで、ボタンを押して起動。中に赤い光が出る部分があって、光る側が指の腹側、その反対側の受光部が爪の根元あたりになるようにするのが良さそう。だから、指の入れ方は浅すぎても指の先が奥に当たって痛むほど突っ込むのもダメ。
測定の終了は指を引き抜くだけ。指を抜いて約8秒後に画面が消えて電源オフになる。ボタン操作での電源オフは無い。
あと、これからの寒い時期は指が冷え切った状態では正常に測定できないので少し温まった状態で測るのが良いと思う。まぁ簡易測定器だからね。

少なくとも脈拍は正しく測定できているみたい。自分で測った脈拍数と表示が一応一致するし、測定中に指の根本を抑えると脈拍が測定できなくなるのでインチキ表示ではない様子。動脈血酸素飽和度は家だと他に調べる方法がないから正しいのかは不明。でも、指が冷えた状態で測定するとSpO2の数値が下がるので全くのインチキではなさそう。

運悪く?現在は呼吸器が健康なので暫くは出番が少なそうだけど、肺炎になったら使うことになるかな?
今年話題の新型コロナでも感染して悪化したら出番になる機器だよね。(入院したら自前の機器は要らないけど)

息を止めて「もう無理」ってまで我慢すると、少し遅れてSpO2が90くらいまで下がる。つまり、肺炎とかで90の状態って相当ツラいと思う。

Up