始まり
5/9です
やったこと
- キャッシュのキーを生成する関数を実装
- Docker周りのあれこれ
- Go周りのあれこれ
午前中がアルバイトかつ、午後から授業があったので疲れましたが、なんとかやりました。
キャッシュのキーを生成する関数を実装
とりあえず、一番の進展はこれです。ハッシュ関数を使ってホスト名、パス、クエリパラメータをハッシュ化するための関数を用意しました。
一番困ったのは、Goのホスト、パスの扱いです。http.Request.Hostとhttp.Request.URL.Hostname()の違いなどを調べるのに悪戦苦闘しまして、、、大変時間がかかりました。
今も、なんとなくしかわかっていないのですが、http.Request.URL.Hostやhttp.Request.URL.Hostname()はサーバー側では大体の場合、空になります。
これはHostの情報が、Hostヘッダに書かれるため、http.Request.Hostに格納されるからです。
この仕様を完璧に理解するにはまだ時間がかかりそうです。
今現在キーとして、http.Request.Host, http.Request.URL.Path, http.Request.URL.Query()を使っています。できればHeaderの値とか、Cookieとかもキーに含めたいところ。
Docker周りのあれこれ
DockerのコンテナにIPv4アドレスをつけたり、Dockerのマルチステージビルドを少しやってみたりしました。
マルチステージビルドでは、二つのイメージを使って、ビルド環境と実行環境を作成することにより、無駄なものを実行環境のコンテナに含めないようにするらしい。
無駄なものがないってことは、セキュリティ的にも攻撃者が侵入のために使えるアプリを少なくしたりできるので、いいんだろうな。(こういうのをセキュリティの攻撃面というらしい。)
もちろん、キャッシュの効きがよくなったりするので、ビルド速度が上がったりもするらしい。
やっぱり手軽に通信させて遊んだりできるので、Dockerは最高ですね。
知らないことがたくさんあるので、まだまだ色々勉強したい。
Go言語周りのあれこれ
上の二つ以外に、Go言語の勉強もした。特に、HandlerFuncとかのhttpモジュール周りのことをたくさん調べた。
ミドルウェア的な処理ができるっぽいので、loggerを仕込んだりしてみた。
ついでに、わかったこととして、httputil.ReverseProxy.Rewrite関数は、送られてきたリクエストを処理するだけなので、Rewriteの中でキャッシュがあるからそのまま送り返す的な処理はできない!httputil.ReverseProxy.ModifyResponseを使えるかなぁと思ったけど、Rewriteの中でキャッシュがあるかないかを管理するフラグを生成して、値を設定したとしても、そのフラグはどこで管理するんだって話になってしまう。簡単に書くと、RewriteとModifyResponseの間で状態の共有をどうやってやろうかなってこと。また、難しい問題に直面してしまったし、何よりこれは別に本質的な問題ではなくて、ただの書き方の問題だってことも、また俺を嫌な気持ちにさせる要因。
終わり
やりたいことリスト
- リバースプロキシとは何かを理解する
- Dockerコンテナで開発環境を作る
- LRUキャッシュ
- リバースプロキシにキャッシュキー生成関数を実装
- リバースプロキシがコンテンツをキャッシュしてキャッシュを返却するようにする。
- TTLをつける
- LRUキャッシュをジェネリクスとして実装しなおす
- eviction policyにコンテンツサイズを使う
- ラウンドロビン方式の実装
- 簡易的なDNSラウンドロビンができるDNSを実装
- (できれば)TCPのSYNパケットをみてコネクションを制御する(Connection Tracking Table)
- Consistent Hashing
頼みます!!セキュリティキャンプ受からせてください!!