Statischer Server

Middleware, das statische Dateien oder eingebettete Dateien als Dienst bereitstellt. Detaillierte API finden Sie in der Dokumentation.

Anwendungsszenarien

Statische Dateiserver haben vielfältige Anwendungsmöglichkeiten in Webanwendungen:

  • Bereitstellung statischer Ressourcen wie CSS, JavaScript, Bilder etc.
  • Hosting von Single-Page-Anwendungen (SPA)
  • Verteilung von Dokumenten, Mediendateien, Download-Inhalten
  • Komplette Hosting-Lösung für einfache Websites

Hauptfunktionen

  • StaticDir bietet Unterstützung für statische lokale Verzeichnisse. Es können mehrere Verzeichnisse als Parameter übergeben werden. Beispiel:
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;
}

Wenn die entsprechende Datei im ersten Verzeichnis nicht gefunden wird, wird im zweiten Verzeichnis gesucht.

StaticDir unterstützt die bevorzugte Auslieferung komprimierter Dateien, falls vorhanden. Bei Vorhandensein von index.html, index.html.gz, index.html.zst, index.html.br werden letztere als vorab komprimierte Versionen betrachtet und entsprechend der Anfrageinformationen ausgeliefert.

  • Unterstützung für rust-embed, zum Beispiel:

Vor- und Nachteile von rust-embed

Vorteile:

  • Statische Dateien werden in die Binärdatei kompiliert, was die Bereitstellung vereinfacht
  • Keine separate Verwaltung statischer Dateien in der Produktionsumgebung nötig
  • Potenziell bessere Leistung (Speicherzugriff vs. Festplatten-I/O)
  • Höhere Sicherheit, da Dateien nicht versehentlich geändert werden können

Nachteile:

  • Vergrößert die Binärdatei der Anwendung
  • Aktualisierungen statischer Inhalte erfordern Neukompilierung und erneute Bereitstellung
  • Nicht geeignet für häufig ändernde, umfangreiche statische Inhalte
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;
}

Mit default kann eine Standardseite festgelegt werden. with_fallback und fallback ermöglichen die Angabe einer Ersatzdatei bei nicht gefundenen Dateien, was insbesondere für bestimmte Single-Page-Anwendungen nützlich sein kann.