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: .file("/path/to/key.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)