RustでWebアプリケーションを開発する際、フレームワーク選びは最初にして最も重要な判断のひとつです。2026年現在、Rustの主要WebフレームワークはAxumActix-webRocketの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つの中で最も高い人気を持ちます。

項目AxumActix-webRocket
開発元TokioチームコミュニティSergio Benitez
最新安定版v0.8v4v0.5
ランタイムTokioTokio(独自ランタイムも内蔵)Tokio
GitHub Stars約21,000+約22,000+約25,000+
ライセンスMITMIT/Apache-2.0MIT/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 レスポンスになります。マクロは一切使用していません。

Actix-web

use actix_web::{get, web, App, HttpServer, Responder};
use serde::Serialize;

#[derive(Serialize)]
struct User {
    id: u64,
    name: String,
}

#[get("/user")]
async fn get_user() -> impl Responder {
    web::Json(User {
        id: 1,
        name: "Taro".to_string(),
    })
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| App::new().service(get_user))
        .bind("0.0.0.0:3000")?
        .run()
        .await
}

Actix-webでは #[get("/user")] マクロでルートとHTTPメソッドを定義します。ハンドラの戻り値は impl Responder トレイトを使い、web::Json でJSONレスポンスを返します。

Rocket

#[macro_use]
extern crate rocket;

use rocket::serde::json::Json;
use serde::Serialize;

#[derive(Serialize)]
struct User {
    id: u64,
    name: String,
}

#[get("/user")]
fn get_user() -> Json<User> {
    Json(User {
        id: 1,
        name: "Taro".to_string(),
    })
}

#[launch]
fn rocket() -> _ {
    rocket::build().mount("/", routes![get_user])
}

Rocketでは #[launch] マクロでサーバーの起動を、#[get] マクロでルーティングを宣言します。routes! マクロでハンドラをマウントする構文が特徴的です。コード量は最も少なくなります。

コード比較まとめ

観点AxumActix-webRocket
ルーティング定義Router::new().route()#[get] マクロ + .service()#[get] マクロ + routes!
JSON返却Json<T>web::Json<T>Json<T>
マクロ使用量なし少量多い
ボイラープレート
起動定義axum::serve()HttpServer::new()#[launch]

パフォーマンス比較

TechEmpower Web Framework BenchmarksおよびRustコミュニティのベンチマーク報告をもとに、典型的なJSON APIサーバーでのパフォーマンスを比較します。なお、ベンチマーク結果は環境・設定・ワークロードによって変動するため、あくまで傾向として参照してください。

指標AxumActix-webRocket
JSONシリアライズ(req/s)約600,000約650,000約400,000
プレーンテキスト(req/s)約700,000約750,000約450,000
レイテンシ(p99)低い最も低いやや高い
メモリ使用量少ない少ないやや多い
コールドスタート時間高速高速やや遅い(マクロ展開)

Actix-webが全体的に最も高いスループットを記録しています。Axumも僅差で続いており、実用上の差はほとんどありません。Rocketはマクロ展開のオーバーヘッドとランタイムの構造上、他の2つと比較するとパフォーマンスでは劣りますが、一般的なWebアプリケーションでは十分な性能です。

3つのフレームワークすべてが、Go・Node.js・Javaなど他言語の主要フレームワークを大幅に上回るパフォーマンスを持っています。フレームワーク間のパフォーマンス差よりも、アプリケーションのロジックやデータベースアクセスがボトルネックになるケースがほとんどです。

エコシステムとミドルウェア

Axumのエコシステム

AxumはTowerエコシステムを全面的に活用できるため、ミドルウェアの選択肢が最も豊富です。

クレート名用途
tower-httpCORS、圧縮、トレーシング、リクエストサイズ制限
axum-extraCookie、TypedHeader、マルチパートなどの追加機能
towerタイムアウト、レート制限、リトライ、ロードバランシング
axum-loginセッションベースの認証
utoipa + utoipa-axumOpenAPI仕様の自動生成

Towerミドルウェアは他のTower互換フレームワーク(tonic等)と共有できるため、gRPCとHTTPを併用するサービスでもミドルウェアを統一的に管理できます。

Actix-webのエコシステム

Actix-webは独自のミドルウェアトレイトを持ちますが、豊富な公式・サードパーティのミドルウェアが提供されています。

クレート名用途
actix-corsCORS設定
actix-sessionセッション管理
actix-identity認証・ID管理
actix-files静的ファイル配信
actix-multipartマルチパートフォーム処理

Rocketのエコシステム

Rocketはフレームワーク自体に多くの機能が組み込まれているため、外部クレートへの依存が少ない設計です。

組み込み機能説明
FairingsRocketのミドルウェア機構。リクエスト/レスポンスの前後処理
Request Guards認証・バリデーションをハンドラの引数として表現
テンプレートTera / Handlebarsテンプレートの組み込みサポート
フォーム処理型安全なフォームバリデーション
データベースrocket_dbを通じたDB接続プール管理

エコシステム比較

観点AxumActix-webRocket
ミドルウェアの豊富さTower経由で最も多い多いフレームワーク内蔵が中心
ORM連携SeaORM / Diesel / SQLxSeaORM / Diesel / SQLxrocket_db + Diesel / SQLx
OpenAPI対応utoipa(成熟)paperclip / utoiparocket_okapi
WebSocketaxum内蔵actix-ws公式サポートなし(サードパーティ)
gRPC連携tonic(同じTowerエコシステム)別途tonicが必要別途tonicが必要

学習コストと開発体験

学習コスト

観点AxumActix-webRocket
初学者の取り組みやすさ中〜高高(取り組みやすい)
Rust中級者の理解しやすさ
コンパイルエラーの読みやすさ良い普通マクロ由来で難解な場合あり
公式ドキュメントの充実度良い良い非常に良い
チュートリアル・記事の量多い(増加中)多い多い

Rocketは公式ドキュメントが体系的に整備されており、Webフレームワークの経験があればRust初学者でも比較的スムーズに開発を始められます。一方で、マクロの裏側で何が起きているかを理解するにはRustの知識が必要です。

Axumはマクロを使わないため、コードの動作を追いやすい反面、Towerの Service トレイトやExtractorの仕組みを理解するにはRustの型システムに対する理解が求められます。

Actix-webはドキュメントが充実していますが、独自のExtractorパターンやエラーハンドリングの仕組みに慣れるまでに時間がかかることがあります。

開発体験

観点AxumActix-webRocket
コンパイル時間速い速いやや遅い(マクロ展開)
IDE補完の精度高い高いマクロ内は低い場合あり
テスタビリティ高い(tower::ServiceExt)高い(actix-web::test)高い(rocket::local)
ホットリロードcargo-watchで対応cargo-watchで対応cargo-watchで対応

プロジェクト規模別の選定指針

プロジェクトの特性に応じた推奨フレームワークを以下にまとめます。

プロジェクト種別推奨フレームワーク理由
マイクロサービスAxumTower互換でサービス間の共通ミドルウェアを統一。gRPC(tonic)との混在も容易
高トラフィックAPIActix-webベンチマーク最高スコア。レイテンシ要件が厳しいシステムに最適
Webアプリケーション(SSR含む)Rocketテンプレート・フォーム・セッションが組み込みで、フルスタック開発がスムーズ
プロトタイプ・個人開発Rocketボイラープレートが少なく、少ないコード量で動くものを作れる
チーム開発(大規模)Axumマクロ不使用でコードの可読性が高く、レビューしやすい。Tower標準に準拠しておりチーム間の知識移転が容易
gRPC + HTTP混在サービスAxumtonicと同じTowerエコシステムで統一的に構築できる
既存Actix-webプロジェクトActix-webエコシステムが成熟しており、移行するメリットが限定的
パフォーマンス最優先のゲームサーバーActix-webワーカースレッドの独立性が高く、スレッド間ロック競合が少ない

迷ったらAxumを選ぶ理由

2026年現在、新規プロジェクトで迷った場合はAxumを推奨します。理由は以下のとおりです。

  • Tokioチームが開発しており、Rustの非同期エコシステムとの整合性が最も高い
  • Towerエコシステムとの互換性により、将来的な拡張性が高い
  • マクロ不使用のためコンパイルエラーが明確で、チーム開発に適している
  • コミュニティの勢いが最も強く、新しいクレートやチュートリアルが増え続けている

ただし、これは「Actix-webやRocketが劣っている」という意味ではありません。パフォーマンスを極限まで追求する場合はActix-web、DXを最優先する個人プロジェクトではRocketが最適解になるケースも多くあります。

よくある質問(FAQ)

Axumはまだv1.0に達していないが、プロダクションで使えるか?

v1.0未到達ではありますが、Axumは多くの企業でプロダクション利用されています。Tokioチームが開発を主導しており、破壊的変更がある場合も十分なマイグレーションガイドが提供されます。APIの安定性は実質的にプロダクションレベルと判断して問題ありません。

Actix-webのメンテナンス状況は?過去に開発者が離脱した問題は解決したか?

2020年に元メンテナのfafhrd91氏がプロジェクトから離脱する騒動がありましたが、その後コミュニティ主導で開発が継続されています。2026年現在もアクティブにメンテナンスされており、定期的なリリースが行われています。メンテナンスリスクは現時点では低いと言えます。

RocketのAsync対応は十分か?

Rocket v0.5でasync/awaitに完全対応し、Tokioランタイム上で動作するようになりました。非同期処理に関する制約はなく、非同期データベースドライバ(SQLxなど)も問題なく利用できます。v0.5以前のsync専用だった時代の懸念は解消されています。

3つのフレームワークを同じプロジェクト内で混在させることは可能か?

技術的には不可能ではありませんが、推奨しません。それぞれのフレームワークが独自のルーティング・ミドルウェア機構を持つため、混在させるとコードの複雑性が大幅に増加します。マイクロサービスアーキテクチャであれば、サービスごとに異なるフレームワークを選択することは合理的です。

まとめ

Rustの3大Webフレームワーク――Axum・Actix-web・Rocketは、いずれも高品質でプロダクション利用に耐えるフレームワークです。

  • Axum: Towerエコシステムとの統合、マクロ不使用の明快な設計、Tokioチームによる開発。新規プロジェクトの第一候補
  • Actix-web: 最高クラスのパフォーマンス、成熟したエコシステム。高トラフィックシステムに最適
  • Rocket: 開発者体験を最優先した宣言的API設計。プロトタイプや個人開発でスピードを重視する場合に最適

フレームワーク選定で最も重要なのは、プロジェクトの要件・チームの技術力・将来の拡張計画を総合的に評価することです。パフォーマンスの差はRust自体の高速性が担保しているため、どのフレームワークを選んでも他言語の主要フレームワークを上回る性能が得られます。

まずは3つのフレームワークそれぞれで簡単なAPIを実装してみて、開発体験の違いを肌で感じることをおすすめします。コードを書いた上での判断が、最も納得感のある選定につながります。