ogochan
前回永続化するとか言ってましたが、先にSSLとバーチャルホストへの対応をしてしまいました。
と言うか、DB使って永続化ってのは、そんなに難しいテーマではないですからね。普段通りのことをすればいいだけですし。
それよりも、SSLとバーチャルホストへの対応の方がずっとハードルが高いですし、これが上手く出来なければこういったものを作る意味がありません。昔はHTTPだけでも十分意味があったのですけどねぇ(遠い目)
まぁいろいろあるのですが、今回はプロキシを実現させるにあたって、http-proxy
を使うのをやめました。代わりにRedbird
というのを使っています。
これについて日本語の情報はほとんどないのですが、非常に強力で高機能なプロキシライブラリです。
何しろ
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アドレスが入っているので、そのまま使える人は少ないかもだからなくても良いようにも思うので、次回のコミットの時には消すかなぁ。