静的ファイルサーバ

静的ファイルまたは埋め込みファイルをサービスとして提供するミドルウェアです。詳細なAPIはドキュメントを参照してください

ユースケース

静的ファイルサーバーはWebアプリケーションで幅広く使用されます:

  • ウェブサイトの静的リソース(CSS、JavaScript、画像など)の提供
  • シングルページアプリケーション(SPA)のホスティング
  • ドキュメント、メディアファイル、ダウンロードコンテンツの配布
  • シンプルなウェブサイトの完全なホスティングソリューション

主な機能

  • StaticDirはローカルフォルダ内の静的ファイルをサポートします。複数のフォルダをリストとして指定できます。例:
main.rs
Cargo.toml
static-dir-list/src/main.rs
use salvo::prelude::*;
use salvo::serve_static::StaticDir;

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt().init();

    let router = Router::with_path("{*path}").get(
        StaticDir::new([
            "static-dir-list/static/boy",
            "static-dir-list/static/girl",
            "static/boy",
            "static/girl",
        ])
        .include_dot_files(false)
        .defaults("index.html")
        .auto_list(true),
    );

    let acceptor = TcpListener::new("0.0.0.0:5800").bind().await;
    Server::new(acceptor).serve(router).await;
}

最初のフォルダでファイルが見つからない場合、2番目のフォルダを検索します。

StaticDirは圧縮ファイルが存在する場合、優先的に送信します。例えばindex.htmlindex.html.gzindex.html.zstindex.html.brがある場合、index.html.gzindex.html.zstindex.html.brindex.htmlの事前圧縮バージョンとみなされ、リクエスト情報に基づいて対応する圧縮ファイルが送信されます。

  • rust-embedのサポートを提供します。例:

rust-embedの利点と欠点

利点:

  • 静的ファイルをバイナリにコンパイルし、デプロイプロセスを簡素化
  • 本番環境で静的ファイルを個別に管理する必要がない
  • より良いパフォーマンスが得られる可能性(メモリアクセスvsディスクI/O)
  • より安全で、ファイルが誤って変更されることがない

欠点:

  • アプリケーションバイナリのサイズが増加
  • 静的コンテンツの更新にはアプリ全体の再コンパイルと再デプロイが必要
  • 頻繁に変更される大規模な静的コンテンツには不向き
main.rs
Cargo.toml
static-embed-files/src/main.rs
use rust_embed::RustEmbed;
use salvo::prelude::*;
use salvo::serve_static::static_embed;

#[derive(RustEmbed)]
#[folder = "static"]
struct Assets;

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt().init();

    let router = Router::with_path("{*path}").get(static_embed::<Assets>().fallback("index.html"));

    let acceptor = TcpListener::new("0.0.0.0:5800").bind().await;
    Server::new(acceptor).serve(router).await;
}

defaultを使用してデフォルト表示ページを設定できます。with_fallbackfallbackはファイルが見つからない場合に代わりに使用するファイルを設定し、これは一部のシングルページアプリケーションで有用です。