-
HTTPの学習を目的にしたサーバー実装です。
-
プロトコルのコア部分と、NginxのようなConfig機能を実装。
-
RFC2616 RFC7231 RFC7232を参考に実装。
-
Pythonでありながらコアあたり約2kリクエスト/秒の処理能力。
-
実運用サイトとしてインターネットの攻撃パケットを受ける実験をしていました。
実稼働サイトは閉鎖中です、外部Ipv4アドレスとLets'Encryptの要件からVPSに専用のVMが必要でコストがかかるので……
demo2.mp4
Webサーバーとして必要な基本機能を提供します。
主な機能:
- 静的ファイル配信
- リバースプロキシ
- パスベースルーティング(トライ木)
- IPベースアクセス制御
- Keep-Alive対応
- gzipレスポンス圧縮
- ETag生成
- HCLベース設定ファイル
- Cookieの受け渡し、キャッシュ無効処理
- ユーザー情報など、キャッシュされてはいけない場合があるため、詳細なテストを実施
- ストリーミングによる分割レスポンス
- ルールベースのレート制限
パッケージ管理に uv を使用しています。
# 未インストールの場合
curl -LsSf https://astral.sh/uv/install.sh | sh
git clone https://github.com/sanbungi/myhttpserver.git
uv sync
# テスト用静的アセット取得
git submodule update --init --recursive
# 起動
uv run src/main.py --host 0.0.0.0 --config test-assets/config/example.hcl
# テスト
uv run pytest tests --server-mode=config-httpリクエストは以下の処理フローで処理されます。
myhttpserver は HCL (HashiCorp Configuration Language) を使用して設定を定義します。
設定は次の3階層構造で構成されています。
Global → Server → Route
global {
worker_processes = 4
}
server {
host = "localhost"
port = 8080
root = "./public"
}
route "/" {
type = "static"
}詳細な設定リファレンスは Wiki を参照。
https://github.com/sanbungi/myhttpserver/wiki
今後予定している機能:
- HTTP/2対応
- メトリクス機能の強化
- 負荷分散やロードバランサー機能の実験
