🔥

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-br
  • compression-deflate
  • compression-gzip
  • compression-zstd

圧縮レベル

CompressionLayer::new() に関数qualityの引数をEnum CompressionLevel でとって指定可能。省略でDefault。

Fastest

圧縮が最速

Best

圧縮率が最大

Default

デフォルト

Precise(i32)

各方式に基づく圧縮レベルを明示的に指定
存在しないレベルは内部で各最大レベルに制限されるので安心

おわり

Axumならtowerのしくみをそのまま使えて、きれいですね。
こういうのがAxumがこれからのRust webフレームワークの主役である所以だと思います。
簡単ですね。

Discussion