Server¶
Vapor bevat een high-performance, asynchrone HTTP server gebouwd op SwiftNIO. Deze server ondersteunt HTTP/1, HTTP/2, en protocol upgrades zoals WebSockets. De server ondersteunt ook het inschakelen van TLS (SSL).
Configuratie¶
De standaard HTTP server van Vapor kan worden geconfigureerd via app.http.server.
// Ondersteunt alleen HTTP/2
app.http.server.configuration.supportVersions = [.two]
De HTTP-server ondersteunt verschillende configuratie-opties.
Hostname¶
De hostnaam bepaalt op welk adres de server nieuwe verbindingen zal accepteren. De standaard instelling is 127.0.0.1.
// Configureer aangepaste hostnaam.
app.http.server.configuration.hostname = "dev.local"
De hostnaam van de serverconfiguratie kan worden veranderd door de --hostname (-H) vlag mee te geven aan het serve commando of door de hostname parameter mee te geven aan app.server.start(...).
# Overschrijf geconfigureerde hostnaam.
swift run App serve --hostname dev.local
Poort¶
De poort optie bepaalt op welke poort van het opgegeven adres de server nieuwe verbindingen accepteert. De standaardinstelling is 8080.
// Configureer aangepaste poort.
app.http.server.configuration.port = 1337
Info
sudo kan nodig zijn voor het binden aan poorten kleiner dan 1024. Poorten groter dan 65535 worden niet ondersteund.
De poort van de server configuratie kan overschreven worden door de --port (-p) vlag mee te geven aan het serve commando of door de port parameter mee te geven aan app.server.start(...).
# Overschrijf geconfigureerde poort.
swift run App serve --port 1337
Backlog¶
De backlog parameter bepaalt de maximale lengte voor de wachtrij van in behandeling zijnde verbindingen. De standaardwaarde is 256.
// Configureer aangepaste backlog.
app.http.server.configuration.backlog = 128
Reuse Address¶
De reuseAddress parameter staat het hergebruik van lokale adressen toe. Standaard ingesteld op true.
// Adreshergebruik uitschakelen.
app.http.server.configuration.reuseAddress = false
TCP No Delay¶
Het inschakelen van de tcpNoDelay parameter zal proberen om TCP pakket vertraging te minimaliseren. Staat standaard op true.
// Minimaliseer de pakketvertraging.
app.http.server.configuration.tcpNoDelay = true
Response Compression¶
De responseCompression parameter regelt HTTP response compressie met behulp van gzip. De standaardwaarde is .disabled.
// HTTP-responscompressie inschakelen.
app.http.server.configuration.responseCompression = .enabled
Om een initiële buffercapaciteit op te geven, gebruik je de initialByteBufferCapacity parameter.
.enabled(initialByteBufferCapacity: 1024)
Request Decompression¶
De requestDecompression parameter regelt HTTP verzoek decompressie met behulp van gzip. De standaard instelling is .disabled.
// Inschakelen van HTTP verzoek decompressie.
app.http.server.configuration.requestDecompression = .enabled
Om een decompressie limiet op te geven, gebruik de limit parameter. De standaardwaarde is .ratio(10).
// Geen decompressie grootte limiet
.enabled(limit: .none)
Beschikbare opties zijn:
size: Maximale gedecomprimeerde grootte in bytes.ratio: Maximale gedecomprimeerde grootte als verhouding van gecomprimeerde bytes.none: Geen grootte beperkingen.
Het instellen van decompressie grootte limieten kan helpen voorkomen dat kwaadwillig gecomprimeerde HTTP verzoeken grote hoeveelheden geheugen gebruiken.
Pipelining¶
De supportPipelining parameter schakelt ondersteuning voor HTTP request en response pipelining in. De standaard instelling is false.
// Ondersteuning HTTP pipelining.
app.http.server.configuration.supportPipelining = true
Versies¶
De supportVersions parameter bepaalt welke HTTP versies de server zal gebruiken. Standaard zal Vapor zowel HTTP/1 als HTTP/2 ondersteunen wanneer TLS is ingeschakeld. Alleen HTTP/1 wordt ondersteund wanneer TLS is uitgeschakeld.
// Schakel HTTP/1 ondersteuning uit.
app.http.server.configuration.supportVersions = [.two]
TLS¶
De tlsConfiguration parameter regelt of TLS (SSL) is ingeschakeld op de server. De standaardinstelling is nihil.
// Schakel TLS in.
app.http.server.configuration.tlsConfiguration = .makeServerConfiguration(
certificateChain: try NIOSSLCertificate.fromPEMFile("/path/to/cert.pem").map { .certificate($0) },
privateKey: .privateKey(try NIOSSLPrivateKey(file: "/path/to/key.pem", format: .pem))
)
Om deze configuratie te compileren moet u import NIOSSL toevoegen bovenaan uw configuratie bestand. Het kan ook nodig zijn om NIOSSL toe te voegen als een afhankelijkheid in uw Package.swift bestand.
Name¶
De serverName parameter regelt de Server header op uitgaande HTTP antwoorden. De standaardwaarde is nil.
// Voeg "Server: vapor" header toe aan antwoorden.
app.http.server.configuration.serverName = "vapor"
Serve Command¶
Om de server van Vapor op te starten, gebruik het serve commando. Dit commando wordt standaard uitgevoerd als er geen andere commando's zijn opgegeven.
swift run App serve
Het serve commando accepteert de volgende parameters:
hostname(-H): Vervangt de geconfigureerde hostnaam.port(-p): Vervangt de geconfigureerde poort.bind(-b): Vervangt geconfigureerde hostnaam en poort verbonden door:.
Een voorbeeld met de --bind (-b) vlag:
swift run App serve -b 0.0.0.0:80
Gebruik swift run App serve --help voor meer informatie.
Het serve commando zal luisteren naar SIGTERM en SIGINT om de server netjes af te sluiten. Gebruik ctrl+c (^c) om een SIGINT signaal te sturen. Als het log level is ingesteld op debug of lager, zal informatie over de status van graceful shutdown worden gelogd.
Handmatig Starten¶
De server van Vapor kan handmatig worden gestart met app.server.
// Start Vapor's server.
try app.server.start()
// Verzoek server shutdown.
app.server.shutdown()
// Wacht tot de server is afgesloten.
try app.server.onShutdown.wait()
Servers¶
De server die Vapor gebruikt is configureerbaar. Standaard wordt de ingebouwde HTTP server gebruikt.
app.servers.use(.http)
Aangepaste Server¶
Vapor's standaard HTTP server kan worden vervangen door elk type dat voldoet aan Server.
import Vapor
final class MyServer: Server {
...
}
app.servers.use { app in
MyServer()
}
Aangepaste servers kunnen Application.Servers.Provider uitbreiden voor leading-dot syntax.
extension Application.Servers.Provider {
static var myServer: Self {
.init {
$0.servers.use { app in
MyServer()
}
}
}
}
app.servers.use(.myServer)