Przejdź do treści

Serwer#

Vapor zawiera wydajny, asynchroniczny serwer HTTP zbudowany na SwiftNIO. Ten serwer obsługuje HTTP/1, HTTP/2 oraz aktualizacje protokołu, takie jak WebSockets. Serwer obsługuje również włączanie TLS (SSL).

Konfiguracja#

Domyślny serwer HTTP Vapora można skonfigurować za pomocą app.http.server.

// Only support HTTP/2
app.http.server.configuration.supportVersions = [.two]

Serwer HTTP obsługuje kilka opcji konfiguracyjnych.

Hostname#

Hostname kontroluje, na jakim adresie serwer będzie akceptował nowe połączenia. Domyślną wartością jest 127.0.0.1.

// Configure custom hostname.
app.http.server.configuration.hostname = "dev.local"

Hostname skonfigurowany w serwerze można nadpisać, przekazując flagę --hostname (-H) do komendy serve lub przekazując parametr hostname do app.server.start(...).

# Override configured hostname.
swift run App serve --hostname dev.local

Port#

Opcja portu kontroluje, na jakim porcie pod wskazanym adresem serwer będzie akceptował nowe połączenia. Domyślną wartością jest 8080.

// Configure custom port.
app.http.server.configuration.port = 1337

Info

Do bindowania portów mniejszych niż 1024 może być wymagane sudo. Porty większe niż 65535 nie są obsługiwane.

Port skonfigurowany w serwerze można nadpisać, przekazując flagę --port (-p) do komendy serve lub przekazując parametr port do app.server.start(...).

# Override configured port.
swift run App serve --port 1337

Backlog#

Parametr backlog definiuje maksymalną długość kolejki oczekujących połączeń. Domyślną wartością jest 256.

// Configure custom backlog.
app.http.server.configuration.backlog = 128

Ponowne użycie adresu#

Parametr reuseAddress umożliwia ponowne użycie lokalnych adresów. Domyślnie ustawiony na true.

// Disable address reuse.
app.http.server.configuration.reuseAddress = false

TCP No Delay#

Włączenie parametru tcpNoDelay spowoduje próbę zminimalizowania opóźnień pakietów TCP. Domyślnie ustawiony na true.

// Minimize packet delay.
app.http.server.configuration.tcpNoDelay = true

Kompresja odpowiedzi#

Parametr responseCompression kontroluje kompresję odpowiedzi HTTP przy użyciu gzip. Domyślną wartością jest .disabled.

// Enable HTTP response compression.
app.http.server.configuration.responseCompression = .enabled

Aby określić początkową pojemność bufora, użyj parametru initialByteBufferCapacity.

.enabled(initialByteBufferCapacity: 1024)

Dekompresja żądań#

Parametr requestDecompression kontroluje dekompresję żądań HTTP przy użyciu gzip. Domyślną wartością jest .disabled.

// Enable HTTP request decompression.
app.http.server.configuration.requestDecompression = .enabled

Aby określić limit dekompresji, użyj parametru limit. Domyślną wartością jest .ratio(10).

// No decompression size limit
.enabled(limit: .none)

Dostępne opcje to:

  • size: Maksymalny rozmiar po dekompresji w bajtach.

  • ratio: Maksymalny rozmiar po dekompresji jako stosunek do rozmiaru skompresowanego.

  • none: Brak limitów rozmiaru.

Ustawienie limitów rozmiaru dekompresji może pomóc zapobiec sytuacji, w której złośliwie skompresowane żądania HTTP zużywają duże ilości pamięci.

Pipelining#

Parametr supportPipelining włącza obsługę pipeliningu żądań i odpowiedzi HTTP. Domyślną wartością jest false.

// Support HTTP pipelining.
app.http.server.configuration.supportPipelining = true

Wersje#

Parametr supportVersions kontroluje, których wersji HTTP będzie używał serwer. Domyślnie Vapor obsługuje zarówno HTTP/1, jak i HTTP/2, gdy TLS jest włączone. Gdy TLS jest wyłączone, obsługiwane jest tylko HTTP/1.

// Disable HTTP/1 support.
app.http.server.configuration.supportVersions = [.two]

TLS#

Parametr tlsConfiguration kontroluje, czy TLS (SSL) jest włączone w serwerze. Domyślną wartością jest nil.

// Enable TLS.
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))
)

Aby ta konfiguracja mogła się skompilować, musisz dodać import NIOSSL na początku pliku konfiguracyjnego. Może być również konieczne dodanie NIOSSL jako zależności w pliku Package.swift.

Nazwa#

Parametr serverName kontroluje nagłówek Server w wychodzących odpowiedziach HTTP. Domyślną wartością jest nil.

// Add 'Server: vapor' header to responses.
app.http.server.configuration.serverName = "vapor"

Komenda serve#

Aby uruchomić serwer Vapora, użyj komendy serve. Ta komenda uruchamia się domyślnie, jeśli nie podano żadnej innej komendy.

swift run App serve

Komenda serve przyjmuje następujące parametry:

  • hostname (-H): Nadpisuje skonfigurowany hostname.

  • port (-p): Nadpisuje skonfigurowany port.

  • bind (-b): Nadpisuje skonfigurowany hostname i port połączone znakiem :.

Przykład użycia flagi --bind (-b):

swift run App serve -b 0.0.0.0:80

Użyj swift run App serve --help, aby uzyskać więcej informacji.

Komenda serve nasłuchuje sygnałów SIGTERM i SIGINT, aby łagodnie zamknąć serwer. Użyj ctrl+c (^c), aby wysłać sygnał SIGINT. Gdy poziom logowania jest ustawiony na debug lub niższy, informacje o stanie łagodnego zamykania będą logowane.

Ręczne uruchamianie#

Serwer Vapora można uruchomić ręcznie za pomocą app.server.

// Start Vapor's server.
try app.server.start()
// Request server shutdown.
app.server.shutdown()
// Wait for the server to shutdown.
try app.server.onShutdown.wait()

Serwery#

Serwer, którego używa Vapor, jest konfigurowalny. Domyślnie używany jest wbudowany serwer HTTP.

app.servers.use(.http)

Własny serwer#

Domyślny serwer HTTP Vapora może zostać zastąpiony przez dowolny typ zgodny z Server.

import Vapor

final class MyServer: Server {
    ...
}

app.servers.use { app in
    MyServer()
}

Własne serwery mogą rozszerzać Application.Servers.Provider, aby korzystać ze składni z wiodącą kropką.

extension Application.Servers.Provider {
    static var myServer: Self {
        .init {
            $0.servers.use { app in
                MyServer()
            }
        }
    }
}

app.servers.use(.myServer)
Edytuj tę stronę