実装は理解しやすい構造とHTTP仕様の正しさを重視しつつ、実用的な性能も維持することを目標にしています。
主な特徴
- asyncio + マルチコア処理による並行処理
- コアあたり約2kリクエスト/秒の処理能力
- Webサーバーとして必要な基本コンポーネントを実装
- 実際のWebサイトとして試験運用しています。
- RFC2616 / RFC7231 / RFC7232 を参考に設計
すべてのHTTP仕様を完全に満たしているわけではありませんが、RFC準拠を目標として継続的に改善を行っています。
demo2.mp4
シンプルな構造を維持しつつ、Webサーバーとして必要な基本機能を提供します。
主な機能:
- 静的ファイル配信
- リバースプロキシ
- パスベースルーティング(トライ木)
- IPベースアクセス制御
- Keep-Alive対応
- gzipレスポンス圧縮
- ETag生成
- HCLベース設定ファイル
- Cookieの受け渡し、キャッシュ無効処理
- ユーザー情報など、キャッシュされてはいけない場合があるため、詳細なテストを実施
- ストリーミングによる分割レスポンス
- ルールベースのレート制限
HTTPサーバーの基本コンポーネントを理解しやすい形で実装することを重視しています。
このプロジェクトでは Pythonパッケージ管理に 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リクエストは以下の処理フローで処理されます。
処理途中でエラーが発生した場合は HTTP 500 を返します。
myhttpserver は HCL (HashiCorp Configuration Language) を使用して設定を定義します。
設定は次の3階層構造で構成されています。
Global → Server → Route
| Scope | 説明 |
|---|---|
| global | サーバープロセス全体の設定 |
| server | バーチャルホスト設定 |
| route | パス単位のルーティング |
global {
worker_processes = 4
}
server {
host = "localhost"
port = 8080
root = "./public"
}
route "/" {
type = "static"
}詳細な設定リファレンスは Wiki を参照してください。
https://github.com/sanbungi/myhttpserver/wiki
テストには pytest を使用しています。
uv run pytest tests --server-mode=config-http今後予定している機能:
- HTTP/2対応
- メトリクス機能の強化
- 負荷分散やロードバランサー機能の実験
