Rust Webフレームワーク比較2026|Axum vs Actix-web vs Rocket
RustでWebアプリケーションを開発する際、フレームワーク選びは最初にして最も重要な判断のひとつです。2026年現在、Rustの主要WebフレームワークはAxum・Actix-web・Rocketの3つに集約されています。 いずれもプロダクション利用に耐える品質を備えていますが、設計思想・パフォーマンス特性・開発体験がそれぞれ異なるため、プロジェクトの要件に応じた選定が必要です。本記事では、この3つのフレームワークを複数の観点から徹底的に比較し、選定の判断材料を提供します。 3つのフレームワークの概要 Axum AxumはTokioチームが開発するWebフレームワークで、Towerミドルウェアエコシステムとの完全な互換性を持つ点が最大の特徴です。2021年にリリースされ、2026年現在はv0.8系が最新です。マクロに頼らず、Rustの型システムを最大限に活用した設計を採用しています。GitHubのStar数は約21,000を超え、急速にRustコミュニティのデファクトスタンダードへと成長しています。 Actix-web Actix-webはRustのWebフレームワークとして最も長い歴史を持つプロジェクトのひとつです。TechEmpower Web Framework Benchmarksで常にトップクラスの成績を記録しており、生のパフォーマンスを最重視するプロジェクトで選ばれています。独自のランタイムを内蔵しており、v4系ではTokioとの統合も進んでいます。GitHubのStar数は約22,000です。 Rocket Rocketは「開発者の使いやすさ」を第一に掲げるフレームワークです。Rustのマクロ(proc-macro)を活用して、ルーティングやリクエストのバリデーションをアトリビュートで宣言的に記述できます。v0.5でasync/awaitに対応し、Tokioランタイム上で動作するようになりました。GitHubのStar数は約25,000で、3つの中で最も高い人気を持ちます。 項目 Axum Actix-web Rocket 開発元 Tokioチーム コミュニティ Sergio Benitez 最新安定版 v0.8 v4 v0.5 ランタイム Tokio Tokio(独自ランタイムも内蔵) Tokio GitHub Stars 約21,000+ 約22,000+ 約25,000+ ライセンス MIT MIT/Apache-2.0 MIT/Apache-2.0 設計思想の違い 3つのフレームワークは、Rustで「Webサーバーをどう書くべきか」という問いに対して、それぞれ異なる回答を持っています。 Axum: Towerエコシステムとの統合 Axumの設計の核心はTowerとの完全統合です。TowerはHTTPに限らず、あらゆるリクエスト/レスポンス型のサービスを抽象化するRustのミドルウェアフレームワークです。Axumのルーターやハンドラはすべて tower::Service トレイトを実装しており、Towerエコシステムの既存ミドルウェア(タイムアウト、レート制限、リトライなど)をそのまま利用できます。 また、Axumはproc-macroを使わない設計を採用しています。ルーティングもハンドラもすべて通常のRustコードとして記述するため、IDEの補完やコンパイルエラーのメッセージが明確です。 Actix-web: アクターモデルの遺産と生パフォーマンス Actix-webは元々Actixアクターフレームワーク上に構築されていました。現在のv4ではアクターモデルへの依存は大幅に削減されていますが、内部のワーカースレッドモデルやリクエスト処理のパイプラインには、アクターモデルに由来する効率的な設計が残っています。 各ワーカースレッドが独立したイベントループを持ち、スレッド間のロック競合を最小化する設計により、高スループットを実現しています。パフォーマンスに妥協しない設計思想が、ベンチマークでの圧倒的な成績につながっています。 Rocket: マクロによる宣言的API設計 Rocketは開発者体験(DX) を最優先に設計されています。#[get]、#[post]などのアトリビュートマクロでルーティングを宣言的に記述し、リクエストガード(Request Guard)というパターンで認証・バリデーションをハンドラの引数として自然に組み込めます。 この設計により、フレームワーク固有のボイラープレートが最小化され、Webアプリケーションのロジックに集中できます。ただし、マクロの裏側でコード生成が行われるため、コンパイル時間が長くなる傾向があります。 基本的なAPIサーバー実装 同じ機能(JSONレスポンスを返すGETエンドポイント)を3つのフレームワークで実装し、コードの違いを比較します。 Axum use axum::{routing::get, Json, Router}; use serde::Serialize; use tokio::net::TcpListener; #[derive(Serialize)] struct User { id: u64, name: String, } async fn get_user() -> Json<User> { Json(User { id: 1, name: "Taro".to_string(), }) } #[tokio::main] async fn main() { let app = Router::new().route("/user", get(get_user)); let listener = TcpListener::bind("0.0.0.0:3000").await.unwrap(); axum::serve(listener, app).await.unwrap(); } Axumではハンドラは通常のasync関数です。戻り値に Json<T> を使うと自動的に Content-Type: application/json レスポンスになります。マクロは一切使用していません。 ...