🔥
Rust, AxumでHTTP圧縮
サンプル
Cargo.toml
[package]
name = "axum_compression_sample"
version = "0.1.0"
edition = "2024"
[dependencies]
axum = "0.8.4"
tokio = { version = "1.47.1", features = ["macros", "rt-multi-thread"] }
tower-http = { version = "0.6.6", features = ["compression-br"] }
src/main.rs
use axum::{Router, routing::get};
use tokio::net::TcpListener;
use tower_http::compression::{CompressionLayer, CompressionLevel};
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/", get(index))
.layer(CompressionLayer::new().quality(CompressionLevel::Precise(5)));
let listener = TcpListener::bind("127.0.0.1:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
async fn index() -> &'static str {
include_str!("../shunkin_sho.txt")
}
shunkin_sho.txt
春琴抄
谷崎潤一郎
○
春琴、ほんとうの名は鵙屋琴《もずやこと》、大阪|道修町《どしょうまち》の薬種商の生れで...
(略)

圧縮方式
Cargo.toml にtower-httpのfeaturesで以下を指定可能。
compression-brcompression-deflatecompression-gzipcompression-zstd
圧縮レベル
CompressionLayer::new() に関数qualityの引数をEnum CompressionLevel でとって指定可能。省略でDefault。
Fastest
圧縮が最速
Best
圧縮率が最大
Default
デフォルト
Precise(i32)
各方式に基づく圧縮レベルを明示的に指定
存在しないレベルは内部で各最大レベルに制限されるので安心
おわり
Axumならtowerのしくみをそのまま使えて、きれいですね。
こういうのがAxumがこれからのRust webフレームワークの主役である所以だと思います。
簡単ですね。
Discussion