Skip to content

Repository files navigation

myhttpserver

Build Pytest

Overview

  • HTTPの学習を目的にしたサーバー実装です。

  • プロトコルのコア部分と、NginxのようなConfig機能を実装。

  • RFC2616 RFC7231 RFC7232を参考に実装。

  • Pythonでありながらコアあたり約2kリクエスト/秒の処理能力。

  • 実運用サイトとしてインターネットの攻撃パケットを受ける実験をしていました。

実稼働サイトは閉鎖中です、外部Ipv4アドレスとLets'Encryptの要件からVPSに専用のVMが必要でコストがかかるので……

Demo

demo2.mp4

Features

Webサーバーとして必要な基本機能を提供します。

主な機能:

  • 静的ファイル配信
  • リバースプロキシ
  • パスベースルーティング(トライ木)
  • IPベースアクセス制御
  • Keep-Alive対応
  • gzipレスポンス圧縮
  • ETag生成
  • HCLベース設定ファイル
  • Cookieの受け渡し、キャッシュ無効処理
  • ユーザー情報など、キャッシュされてはいけない場合があるため、詳細なテストを実施
  • ストリーミングによる分割レスポンス
  • ルールベースのレート制限

Develop

パッケージ管理に 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

Architecture

リクエストは以下の処理フローで処理されます。

server_flow_yoko

Configuration

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

Roadmap

今後予定している機能:

  • HTTP/2対応
  • メトリクス機能の強化
  • 負荷分散やロードバランサー機能の実験

About

HTTP 1.1 server built from scratch

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages