概要
- ymawky はApple Silicon向けの ARM64アセンブリ製Webサーバ
- syscallのみ で動作、 libc不使用、 接続ごとにfork
- MacOS用だが、 Linux移植には修正が必要
- GET/PUT/DELETE/OPTIONS/HEAD リクエスト対応、 静的ファイル配信
- 独自エラーページ・ディレクトリリスト・セキュリティ対策 搭載
ymawky: ARM64アセンブリ製Webサーバ概要
- 完全手書きARM64アセンブリ によるWebサーバ実装
- syscallのみ利用、 libc完全不使用 設計
- MacOS (Apple Silicon/ARM64) 専用サーバ
- fork-per-connection モデル採用
- 移植性重視 だが、Linux等では 細かな修正 が必要
- Xcode Command Line Tools 必須(
xcode-select --installで導入) - www/ ディレクトリ配下をドキュメントルートに指定
- err/ ディレクトリで独自エラーページ(例:404.html)をサポート
- index.html がGET /のデフォルト応答ファイル
起動・動作方法
makeコマンドでビルド./ymawkyで 127.0.0.1:8080 にてサーバ起動./ymawky [port番号]で 指定ポート で起動./ymawky [数字以外の文字]で デバッグモード 起動(fork無効・単一リクエストのみ対応)- カスタムアドレス未対応 (127.0.0.1固定)
対応HTTP機能・特徴
- 静的ファイルサーバ として動作
- GET/PUT/DELETE/OPTIONS/HEAD メソッド対応
- サーバサイド動的生成・高度なURLパース非対応
- パーセントエンコーディング(%20等)デコード対応
- パストラバーサル防止 (..による上位ディレクトリ参照をブロック)
- www/ 自動付与によるドキュメントルート強制
- PUTアップロード最大1GiB (設定で拡張可)
- PUTは一時ファイル→リネームによるアトミック処理
- Content-Length検証・MIMEタイプ自動判別
- Range: bytes= ヘッダによる部分配信対応(動画スクラブ可)
- HTTP/1.0/1.1 パース対応、 Host必須 (1.1時)
- ディレクトリリスト機能 (index.htmlなければ一覧表示)
セキュリティ・安全対策
- PATH_MAX(4096バイト)超のパス拒否
- パストラバーサル(/../..)のリクエスト拒否
- 16バイト未満のパス拒否
- www/以下にパスを強制
- シンボリックリンクパス拒否(O_NOFOLLOW_ANY)
- PUTは一時ファイル(.ymawky_tmp_)利用で部分書き込み防止
- 一時ファイルへのGET/PUT拒否
- 10秒以内にデータ受信なければコネクション切断(スローロリス対策)
- ヘッダ全体も10秒以内受信必須
サポートHTTPステータスコード
- 200 OK、201 Created、204 No Content、206 Partial Content
- 400 Bad Request、403 Forbidden、404 Not Found、408 Request Timeout
- 409 Conflict、411 Length Required、413 Content Too Large、414 URI Too Long
- 416 Range Not Satisfiable、418 I'm a teapot、431 Request Header Fields Too Large
- 500 Internal Server Error、501 Not Implemented、503 Service Unavailable
- 505 HTTP Version Not Supported、507 Insufficient Storage
- err/ディレクトリ にカスタムエラーページ(各コード対応HTML)配置可能
- build_err_pages.sh で一括生成・カスタマイズ対応
MIMEタイプ自動判別
- 拡張子ごとにMIMEタイプを自動判定
- Web系: .html, .css, .js, .json, .wasm, .xml, .csv, .map, .mjs
- 画像: .png, .jpg, .jpeg, .gif, .svg, .ico, .webp, .avif, .bmp, .tiff, .apng
- フォント: .woff, .woff2, .ttf, .otf
- 文書: .txt, .pdf, .doc, .docx, .epub, .rtf
- 動画: .mp4, .webm, .mkv, .avi, .mov
- 音声: .mp3, .ogg, .wav, .flac, .aac, .m4a, .opus
- アーカイブ: .zip, .gz, .tar, .7z, .bz2, .rar
設定ファイルとカスタマイズ
- config.S で各種設定可能
- DEFAULT_DIR: ドキュメントルート(例:"www/")
- ERR_DIR: エラーページディレクトリ(例:"err/")
- DEFAULT_FILE: デフォルトファイル(例:"index.html")
- RECV_TIMEOUT: 受信タイムアウト秒数(例:10秒)
- HEADER_REQ_TIMEOUT_SECS: ヘッダ受信タイムアウト(例:10秒)
- PUT_GRACE_SECS: PUT時の最小猶予(例:5秒)
- PUT_MIN_BPS: PUT時の最小バイト/秒(例:16KB)
- MAX_BODY_SIZE: PUT許容最大サイズ(例:1GB)
- MAX_PROCS: 最大同時プロセス数(例:256)
MacOS特有の実装注意点
- MacOS専用システムコール (x16+svc #0x80利用、Linuxはx8+svc #0)
- エラー報告形式や構造体レイアウトの違い
- fork()の戻り値仕様差
- SO_NOSIGPIPE, O_NOFOLLOW_ANY, renameatx_np()等MacOS固有
- Mach-O用アセンブリ記法(adr xN, foo@PAGE等)
- sigaction構造体とシグナルトランポリンの挙動差
- Linux移植時は各所のアセンブリ/システムコール修正が必要
"Safety"と注意事項
- 個人プロジェクト としての実装のため 未知の脆弱性 リスクあり
- 可能な限り 安全対策 を施しているが 本番利用前に十分な検証推奨
参考リンク・詳細情報
- 公式詳細解説・ドキュメント: https://imtomt.github.io/ymawky/
- Special Thanks: Bob Johnson, Bob Johnson's Therapist
追記: ymawkyは Apple Silicon/MacOS専用、静的ファイルWebサーバ。 アセンブリ愛好家や低レイヤ学習者向け プロジェクト。 GET/PUT/DELETE/HEAD/OPTIONS対応、Rangeヘッダ・エラーページ・ディレクトリリスト・簡易DoS対策 を搭載。 詳細は公式サイト参照。