ハードウェアからサーバ・アプリまでワンストップで開発

前回永続化するとか言ってましたが、先にSSLとバーチャルホストへの対応をしてしまいました。

と言うか、DB使って永続化ってのは、そんなに難しいテーマではないですからね。普段通りのことをすればいいだけですし。

それよりも、SSLとバーチャルホストへの対応の方がずっとハードルが高いですし、これが上手く出来なければこういったものを作る意味がありません。昔はHTTPだけでも十分意味があったのですけどねぇ(遠い目)

まぁいろいろあるのですが、今回はプロキシを実現させるにあたって、http-proxyを使うのをやめました。代わりにRedbirdというのを使っています。

Redbird Reverse Proxy

これについて日本語の情報はほとんどないのですが、非常に強力で高機能なプロキシライブラリです。

何しろ

With built-in Cluster, HTTP2, LetsEncrypt and Docker support

なんて書かれてたりします。もう何でもアリな感じです。今回は使いませんが、ロードバランサ動作とかもしてくれます。自動でLetsEncryptの鍵を作って設定までしてくれるようです(未確認)。

実際解説を読むと、

nginxの設定をJavascriptで書けるようにした

って感じがするような機能があり、かつそれがコードの中で動的に設定可能です。また、コーディングする時もかなり宣言的で、明快です。いくつかの「落とし穴」さえうまく避けることが出来れば、割と誰でも使えるんじゃないかと思います。当然ですが、nginxに「なんとなく似ている」だけで、それ以上の関係はありません。

redbird.register('foobar.com', 'localhost:8082', {
	ssl: {
		key: "../certs/foobar.key",
		cert: "../certs/foobar.crt",
	}
});

こんな感じです。説明なくても何をするかわかりますね。

http-proxyの場合、どう振り分けるかはコーディングしなければなりませんが、Redbirdの場合は振り分けのパターンを宣言するだけです。また、SSLの鍵のこととか、http-proxy(とhttpモジュール)では「いったいどうしたらいいの?」というレベルで難しいのですが、Redbirdは振り分けパターンの宣言のオプションで指定するだけで使えます。プロトコルの細部まで掘り下げる必要がありません。必要なことはほぼ「よしなに」してくますし、どうしてもいじりたければいろいろ小細工する余地もあります。

というわけで、Redbirdを使うことで簡単にSSLとバーチャルホストへの対応が出来てしまいました。

「落とし穴」というのは、随所で「URL的な文字列」の解釈が甘いのか、たとえば「IPアドレスでホスト名を書いた場合、振り分けルールとしては処理してくれるけどSSLの動作はしてくれない」みたいな不思議な動作をするということです(悩んだ時間のほとんどがこれです)。もっともこれは実際に使う時には特には問題にはならないので、「そんなもの」と思っておけば良いだろうと思います。デバッグの時は厄介ですけどね。

そんなわけで、予定よりも早くSSLとバーチャルホストへの対応ができてしまいました。最初に書いたように設定の永続化は別に難しいテーマでも何でもないので、次回このネタで書く時は「リリースしました」とか「運用してます」くらいになるんじゃないかと思います。

GitHubの方は、ここまでいじったものにしてあります。

PS.

動作確認用の鍵も(わざと)一緒に上げたら「おめーのコードにRSAの秘密鍵が含まれてるぞ」という警告が来てしまいました。まぁそれは実際そうなんだけど、デバッグ用のローカルアドレス用の鍵なんでねぇ。それにしても、ちゃんとチェックしてるんですね。抜けば警告は出なくなると思うのですが、お手軽に試してみるにはあった方が良いかなと思ってそのままです。まぁ、CNにローカルIPアドレスが入っているので、そのまま使える人は少ないかもだからなくても良いようにも思うので、次回のコミットの時には消すかなぁ。

最近のエントリー

OrangePi5にZabbixをインストールする

レビュー等の依頼について

オープンソースのノートアプリ「SiYuan」 - CasaOS AppStoreレビュー

お気に入りの色さがし1

創立記念日

現在の営業品目(2)

現在の営業品目(1)

SPDX License Listをデータ化した

Orange Pi5でC3TR-Adapterを試す

CasaOS上で会計システム「Hieronymus」を動かす

会計システム「Hieronymus」v1.0.0 リリースしました

CasaOSでファイル同期アプリSyncthingをセットアップする

第11回 Freshmeat

オープンソースノーコード「Activepieces」でワークフローを作る

RaspberryPiにパーソナルクラウドOS「CasaOS」を導入する

sequelize-cliでdb:migrateすると「SyntaxError: Unexpected token ':'」が出る

LED行燈の試作(2)

CMSの社内向けサービスのリニューアル

LED行燈の試作(1)

エントリを書くこと