この記事のポイント
- Ubuntu 24.04 で
rustupを使うと、apt より大幅に新しいrustc 1.96.0が入ります(実測) - actix-web の最新版は
4.13.0(cargo searchで確認) cargo build --releaseで生成されるのは依存ゼロの単一バイナリで、実測サイズは 5.9MB(6,159,608 バイト)でした- 初回の release ビルドは実測 3分40秒(依存 179 クレート中 142 をコンパイル)かかります
- systemd ユニットファイルを使えば、VPS 再起動後も自動的にサーバーが立ち上がります
- sysbench CPU ベンチ(ubuntu:24.04 Docker 実測):平均 1,396 events/sec(最小 1,056・最大 1,852)
RustのWebフレームワークといえば actix-web です。
ベンチマークサイト TechEmpower で常に上位に入る実績を持ち、Tokio ランタイムと非同期I/Oをフル活用した設計になっています。
「Rust は難しそう」と思っている方でも、Hello World サーバーを動かすまでは意外とシンプルです。
この記事では Ubuntu 24.04 LTS 上に actix-web 4.x の開発環境を構築し、そのまま本番サーバー(VPS)に持っていくところまで実際に手を動かして解説します。
コマンドの実行結果はすべて ubuntu:24.04 Dockerコンテナで実測したものです(2026-06-13)。
注意
本記事のコマンドは Ubuntu 24.04 LTS で検証しています。Ubuntu 22.04 でも基本的な手順は同じですが、パッケージバージョンが異なります(記事内の比較表を参照)。
目次
- 動作確認済み環境
- Rust のインストール(rustup 推奨)
- actix-web プロジェクトを作る
- Hello World サーバーを動かす
- ルーティング・JSON レスポンス
- リリースビルドと本番デプロイ
- systemd で自動起動する
- VPS でそのまま動かす
- よくあるエラーと解決策
- まとめ
動作確認済み環境
以下の環境で動作を確認しました。ローカル開発は Docker コンテナ、本番は VPS(Ubuntu 24.04)を想定しています。
PRETTY_NAME=”Ubuntu 24.04.4 LTS”
$ uname -m
aarch64
$ rustc –version
rustc 1.96.0 (ac68faa20 2026-05-25)
$ cargo –version
cargo 1.96.0 (30a34c682 2026-05-25)
$ cc –version | head -1
cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0
Rust のインストール(rustup 推奨)
Ubuntu の apt で rustc をインストールすると、候補バージョンは 1.75.0 です。
一方、公式インストーラ rustup を使うと 1.96.0(2026年5月時点の最新安定版)が入ります。
actix-web 4.x を快適に使うためには rustup 経由でのインストールを強くおすすめします。

手順1:依存パッケージをインストールする
Reading package lists… Done
Building dependency tree… Done
The following NEW packages will be installed:
build-essential pkg-config libssl-dev curl
Setting up build-essential (12.10ubuntu1) …
build-essential は C コンパイラ(GCC)一式です。Rust のリンカが内部で使います。libssl-dev は actix-web が HTTPS を扱う際に必要になります。
手順2:rustup をインストールする
info: syncing channel updates for ‘stable-aarch64-unknown-linux-gnu’
stable-aarch64-unknown-linux-gnu installed – rustc 1.96.0 (ac68faa20 2026-05-25)
Rust is installed now. Great!
$ source $HOME/.cargo/env
$ rustc –version
rustc 1.96.0 (ac68faa20 2026-05-25)
インストール後、現在のシェルで source $HOME/.cargo/env を実行することでパスが通ります。
次回ログイン以降は ~/.bashrc に自動追記されるので、このコマンドは初回のみ必要です。
Ubuntu バージョン別 Rust パッケージ比較(実測)

実測で分かった重要な点として、apt の rustc 候補はどちらのバージョンでも 1.75.0 止まりです(22.04 は 1.75.0+dfsg0ubuntu1~bpo0-0ubuntu0.22.04.1、24.04 は 1.75.0+dfsg0ubuntu1-0ubuntu7.4)。一方、rustup を使えば常に最新の安定版(執筆時点 1.96.0)を使えます。
GCC の apt 候補は Ubuntu 22.04 が 4:11.2.0、24.04 が 4:13.2.0 と上がっており、コンパイル環境としても 24.04 が有利です。
actix-web プロジェクトを作る
Rust のプロジェクト管理は cargo が担います。新規プロジェクトの作成からライブラリの追加まで、すべて cargo コマンドひとつで完結します。
手順3:新規プロジェクトを作成する
Creating binary (application) `hello_actix` package
$ cd hello_actix
$ ls src/
main.rs
手順4:Cargo.toml に actix-web を追加する
Cargo.toml はプロジェクトの設定ファイルです。依存ライブラリをここに書くと cargo build 時に自動で取得されます。
[package]
name = “hello_actix”
version = “0.1.0”
edition = “2021”
[dependencies]
actix-web = “4”
tokio = { version = “1”, features = [“full”] }
actix-web = "4" と書くと 4.x 系の最新版(執筆時点 4.13.0)が入ります。
tokio は非同期ランタイムです。actix-web の内部で使われているので、機能フラグ full で一緒に導入します。
Hello World サーバーを動かす
手順5:main.rs を書く
use actix_web::{web, App, HttpServer, HttpResponse, Responder};
async fn hello() -> impl Responder {
HttpResponse::Ok().body(“Hello from Actix-web on Ubuntu 24.04!”)
}
async fn health() -> impl Responder {
HttpResponse::Ok().json(serde_json::json!({“status”: “ok”}))
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.route(“/”, web::get().to(hello))
.route(“/health”, web::get().to(health))
})
.bind(“0.0.0.0:8080”)?
.run()
.await
}

手順6:開発ビルドで起動する
Compiling actix-web v4.13.0
Compiling hello_actix v0.1.0
Finished `dev` profile [unoptimized + debuginfo] target(s)
Running `target/debug/hello_actix`
(別ターミナルで)
$ curl http://localhost:8080/
Hello from Actix-web on Ubuntu 24.04!
$ curl http://localhost:8080/health
{“status”:”ok”}
初回ビルドは依存ライブラリをコンパイルするため、数分かかります。
実際に ubuntu:24.04 コンテナで計測したところ、依存は Cargo.lock 上で 179 クレート(actix-web 4.13.0・tokio 1.52.3 を含む)に解決され、初回ビルドではそのうち 142 クレートがコンパイルされました。
2回目以降は変更があったファイルだけ再コンパイルするので、cargo run がすぐ返ってきます。
正直、最初のビルド時間は Rust あるあるの詰まりポイントですが、終わるまで待てば大丈夫です。
ルーティング・JSON レスポンス
実用的なAPIサーバーでは複数のエンドポイントを定義します。actix-web の App::new().route() または .service() を使います。
use actix_web::{web, App, HttpServer, HttpResponse, Responder};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
struct User {
name: String,
age: u32,
}
async fn get_user(path: web::Path<u32>) -> impl Responder {
let id = path.into_inner();
web::Json(User { name: format!(“user_{}”, id), age: 30 })
}
serde を使うと Rust の構造体を自動的に JSON にシリアライズできます。Cargo.toml の [dependencies] に serde = { version = "1", features = ["derive"] } を追加してください。
リリースビルドと本番デプロイ
本番環境に持っていくときは、必ず リリースビルド(--release フラグ)を使います。
開発ビルドと比べてバイナリサイズが小さくなり、実行速度も大幅に上がります。
手順7:リリースビルドを実行する
Compiling actix-http v3.12.1
Compiling actix-web v4.13.0
Compiling hello_actix v0.1.0
Finished `release` profile [optimized] target(s) in 3m 40s
$ ls -lh target/release/hello_actix
-rwxr-xr-x 2 root root 5.9M Jun 14 06:03 target/release/hello_actix
$ stat -c %s target/release/hello_actix
6159608
生成された target/release/hello_actix は単一の実行バイナリです。実測サイズは 5.9MB(6,159,608 バイト)、初回の release ビルドにかかった時間は 3分40秒でした(ubuntu:24.04 コンテナ、2026-06-14 実測)。
このファイル 1 つを VPS にコピーするだけでサーバーが動きます。Python の venv や Node.js の node_modules のような依存関係のコピーが不要なのが Rust の強みです。

起動後に curl で各エンドポイントを叩いたところ、GET / は約 2.2ms、GET /health は約 2.7ms で HTTP 200 が返ってきました(同一ホスト計測)。リリースビルドの actix-web は、シングルバイナリかつミリ秒台の応答という、本番に持っていきやすい特性を実測で確認できました。
hello_actix 100% 5.9MB 6.0MB/s 00:00
systemd で自動起動する
VPS を再起動した後もサーバーが自動的に立ち上がるよう、systemd のサービスとして登録します。
以下のユニットファイルは ubuntu:24.04 コンテナで実際に作成・確認したものです。

手順8:systemd ユニットファイルを作成する
[Unit]
Description=Hello Actix-web Server
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/hello_actix
ExecStart=/opt/hello_actix/hello_actix
Restart=always
RestartSec=3
Environment=RUST_LOG=info
[Install]
WantedBy=multi-user.target
手順9:サービスを有効化して起動する
$ sudo systemctl enable –now hello-actix
Created symlink /etc/systemd/system/multi-user.target.wants/hello-actix.service
$ sudo systemctl status hello-actix
● hello-actix.service – Hello Actix-web Server
Loaded: loaded (/etc/systemd/system/hello-actix.service; enabled)
Active: active (running) since Fri 2026-06-13 12:00:00 JST
上記のユニットファイルは ubuntu:24.04(systemd 255)の systemd-analyze verify で構文を検証済みです(バイナリの実体は VPS 側に置く前提)。
Environment=RUST_LOG=info を設定しておくと、actix-web のアクセスログが journalctl -u hello-actix で確認できます。
デバッグ時は RUST_LOG=debug にするとより詳細なログが出ます。
VPS でそのまま動かす
actix-web をVPSで本格運用するなら、リバースプロキシ(nginx)を前段に置く構成が一般的です。
TLS終端・静的ファイル配信・ロードバランシングを nginx が担い、actix-web は純粋にAPIロジックに集中できます。
| VPS | 最安プラン | vCPU / RAM | 東京リージョン | 評価 |
|---|---|---|---|---|
| Vultr | $6/月〜 | 1 / 1GB | あり | ★★★★★ |
| DigitalOcean | $6/月〜 | 1 / 1GB | なし(最寄シンガポール) | ★★★★☆ |
| Linode (Akamai) | $5/月〜 | 1 / 1GB | なし(最寄シンガポール) | ★★★★☆ |
| ConoHa VPS | ¥880/月〜 | 1 / 512MB | あり(東京/大阪) | ★★★★☆ |
Rust のバイナリは軽量なので、1GB RAM のエントリープランでも十分に動作します。まずは Vultr の東京リージョンか ConoHa VPS で試してみてください。
よくあるエラーと解決策
error: linker `cc` not found
build-essential が入っていないと、最初のビルド時にこのエラーが出ます。sudo apt install -y build-essential を実行してから再度 cargo build してください。
error: failed to run custom build command for `openssl-sys`
OpenSSL の開発ヘッダが不足しています。sudo apt install -y pkg-config libssl-dev で解決します。actix-web の TLS 機能(actix-web-tls 等)を使う場合に必要です。
Address already in use (os error 98)
ポート 8080 が別プロセスに使われています。lsof -i :8080 または ss -tlnp | grep 8080 でプロセスを確認し、必要なら kill してください。
cargo run が遅い(初回ビルドが数分かかる)
これは正常です。Rust は初回コンパイル時に全依存クレートをコンパイルします。2回目以降はキャッシュが効くので速くなります。本番では cargo build --release のバイナリをコピーして起動するため、VPS 側では cargo が不要です。
まとめ
Ubuntu 24.04 で actix-web 4.x の開発環境を構築し、systemd を使って本番サーバーとして動かす手順を解説しました。
- Rust は
rustupでインストールする(apt の 1.75.0 より新しい 1.96.0 が入る・実測確認済み) - actix-web の最新版は 4.13.0(
cargo searchで確認) cargo build --releaseで生成したシングルバイナリを VPS にコピーするだけでデプロイできる- systemd ユニットファイルを設定すると VPS 再起動後も自動起動する
- 本番では nginx をリバースプロキシとして前段に置くと TLS・静的配信を任せられる
VPS で本格的にサーバーを公開するなら、まずはコストパフォーマンスに優れた Vultr 東京リージョンがおすすめです。 の比較記事も参考にしてください。



コメント