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:
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
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.