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 レスポンスになります。マクロは一切使用していません。
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! マクロでハンドラをマウントする構文が特徴的です。コード量は最も少なくなります。
コード比較まとめ
| 観点 | Axum | Actix-web | Rocket |
|---|---|---|---|
| ルーティング定義 | 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サーバーでのパフォーマンスを比較します。なお、ベンチマーク結果は環境・設定・ワークロードによって変動するため、あくまで傾向として参照してください。
| 指標 | Axum | Actix-web | Rocket |
|---|---|---|---|
| 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-http | CORS、圧縮、トレーシング、リクエストサイズ制限 |
| axum-extra | Cookie、TypedHeader、マルチパートなどの追加機能 |
| tower | タイムアウト、レート制限、リトライ、ロードバランシング |
| axum-login | セッションベースの認証 |
| utoipa + utoipa-axum | OpenAPI仕様の自動生成 |
Towerミドルウェアは他のTower互換フレームワーク(tonic等)と共有できるため、gRPCとHTTPを併用するサービスでもミドルウェアを統一的に管理できます。
Actix-webのエコシステム
Actix-webは独自のミドルウェアトレイトを持ちますが、豊富な公式・サードパーティのミドルウェアが提供されています。
| クレート名 | 用途 |
|---|---|
| actix-cors | CORS設定 |
| actix-session | セッション管理 |
| actix-identity | 認証・ID管理 |
| actix-files | 静的ファイル配信 |
| actix-multipart | マルチパートフォーム処理 |
Rocketのエコシステム
Rocketはフレームワーク自体に多くの機能が組み込まれているため、外部クレートへの依存が少ない設計です。
| 組み込み機能 | 説明 |
|---|---|
| Fairings | Rocketのミドルウェア機構。リクエスト/レスポンスの前後処理 |
| Request Guards | 認証・バリデーションをハンドラの引数として表現 |
| テンプレート | Tera / Handlebarsテンプレートの組み込みサポート |
| フォーム処理 | 型安全なフォームバリデーション |
| データベース | rocket_dbを通じたDB接続プール管理 |
エコシステム比較
| 観点 | Axum | Actix-web | Rocket |
|---|---|---|---|
| ミドルウェアの豊富さ | Tower経由で最も多い | 多い | フレームワーク内蔵が中心 |
| ORM連携 | SeaORM / Diesel / SQLx | SeaORM / Diesel / SQLx | rocket_db + Diesel / SQLx |
| OpenAPI対応 | utoipa(成熟) | paperclip / utoipa | rocket_okapi |
| WebSocket | axum内蔵 | actix-ws | 公式サポートなし(サードパーティ) |
| gRPC連携 | tonic(同じTowerエコシステム) | 別途tonicが必要 | 別途tonicが必要 |
学習コストと開発体験
学習コスト
| 観点 | Axum | Actix-web | Rocket |
|---|---|---|---|
| 初学者の取り組みやすさ | 中 | 中〜高 | 高(取り組みやすい) |
| Rust中級者の理解しやすさ | 高 | 中 | 高 |
| コンパイルエラーの読みやすさ | 良い | 普通 | マクロ由来で難解な場合あり |
| 公式ドキュメントの充実度 | 良い | 良い | 非常に良い |
| チュートリアル・記事の量 | 多い(増加中) | 多い | 多い |
Rocketは公式ドキュメントが体系的に整備されており、Webフレームワークの経験があればRust初学者でも比較的スムーズに開発を始められます。一方で、マクロの裏側で何が起きているかを理解するにはRustの知識が必要です。
Axumはマクロを使わないため、コードの動作を追いやすい反面、Towerの Service トレイトやExtractorの仕組みを理解するにはRustの型システムに対する理解が求められます。
Actix-webはドキュメントが充実していますが、独自のExtractorパターンやエラーハンドリングの仕組みに慣れるまでに時間がかかることがあります。
開発体験
| 観点 | Axum | Actix-web | Rocket |
|---|---|---|---|
| コンパイル時間 | 速い | 速い | やや遅い(マクロ展開) |
| IDE補完の精度 | 高い | 高い | マクロ内は低い場合あり |
| テスタビリティ | 高い(tower::ServiceExt) | 高い(actix-web::test) | 高い(rocket::local) |
| ホットリロード | cargo-watchで対応 | cargo-watchで対応 | cargo-watchで対応 |
プロジェクト規模別の選定指針
プロジェクトの特性に応じた推奨フレームワークを以下にまとめます。
| プロジェクト種別 | 推奨フレームワーク | 理由 |
|---|---|---|
| マイクロサービス | Axum | Tower互換でサービス間の共通ミドルウェアを統一。gRPC(tonic)との混在も容易 |
| 高トラフィックAPI | Actix-web | ベンチマーク最高スコア。レイテンシ要件が厳しいシステムに最適 |
| Webアプリケーション(SSR含む) | Rocket | テンプレート・フォーム・セッションが組み込みで、フルスタック開発がスムーズ |
| プロトタイプ・個人開発 | Rocket | ボイラープレートが少なく、少ないコード量で動くものを作れる |
| チーム開発(大規模) | Axum | マクロ不使用でコードの可読性が高く、レビューしやすい。Tower標準に準拠しておりチーム間の知識移転が容易 |
| gRPC + HTTP混在サービス | Axum | tonicと同じ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を実装してみて、開発体験の違いを肌で感じることをおすすめします。コードを書いた上での判断が、最も納得感のある選定につながります。