Ga naar inhoud

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