Vai al contenuto

Server

Vapor include un server HTTP asincrono ad alte prestazioni costruito su SwiftNIO. Questo server supporta HTTP/1, HTTP/2 e aggiornamenti di protocollo come i WebSocket. Il server supporta anche l'abilitazione di TLS (SSL).

Configurazione

Il server HTTP predefinito di Vapor può essere configurato tramite app.http.server.

// Supporta solo HTTP/2
app.http.server.configuration.supportVersions = [.two]

Il server HTTP supporta diverse opzioni di configurazione.

Hostname

L'hostname controlla l'indirizzo su cui il server accetterà nuove connessioni. Il valore predefinito è 127.0.0.1.

// Configura un hostname personalizzato.
app.http.server.configuration.hostname = "dev.local"

L'hostname della configurazione del server può essere sovrascritto passando il flag --hostname (-H) al comando serve o passando il parametro hostname a app.server.start(...).

# Sovrascrive l'hostname configurato.
swift run App serve --hostname dev.local

Porta

L'opzione port controlla su quale porta all'indirizzo specificato il server accetterà nuove connessioni. Il valore predefinito è 8080.

// Configura una porta personalizzata.
app.http.server.configuration.port = 1337

Informazione

Per il binding a porte inferiori a 1024 potrebbe essere richiesto sudo. Le porte superiori a 65535 non sono supportate.

La porta della configurazione del server può essere sovrascritta anche passando il flag --port (-p) al comando serve o passando il parametro port a app.server.start(...).

# Sovrascrive la porta configurata.
swift run App serve --port 1337

Backlog

Il parametro backlog definisce la lunghezza massima per la coda delle connessioni in attesa. Il valore predefinito è 256.

// Configura un backlog personalizzato.
app.http.server.configuration.backlog = 128

Configurare un backlog più grande può essere utile per le applicazioni che si aspettano un alto volume di traffico, ma tieni presente che un backlog più grande può anche aumentare l'uso della memoria.

Riutilizzo Indirizzo

Il parametro reuseAddress consente il riutilizzo degli indirizzi locali. Il valore predefinito è true.

// Disabilita il riutilizzo degli indirizzi.
app.http.server.configuration.reuseAddress = false

TCP No Delay

Abilitare il parametro tcpNoDelay tenterà di minimizzare il ritardo dei pacchetti TCP. Il valore predefinito è true.

// Minimizza il ritardo dei pacchetti.
app.http.server.configuration.tcpNoDelay = true

Compressione delle Risposte

Il parametro responseCompression controlla la compressione delle risposte HTTP usando gzip. Il valore predefinito è .disabled.

// Abilita la compressione delle risposte HTTP.
app.http.server.configuration.responseCompression = .enabled

Per specificare una capacità iniziale del buffer, usa il parametro initialByteBufferCapacity.

.enabled(initialByteBufferCapacity: 1024)

Decompressione delle Richieste

Il parametro requestDecompression controlla la decompressione delle richieste HTTP usando gzip. Il valore predefinito è .disabled.

// Abilita la decompressione delle richieste HTTP.
app.http.server.configuration.requestDecompression = .enabled

Per specificare un limite di decompressione, usa il parametro limit. Il valore predefinito è .ratio(10).

// Nessun limite di dimensione per la decompressione
.enabled(limit: .none)

Le opzioni disponibili sono:

  • size: Dimensione massima decompressa in byte.
  • ratio: Dimensione massima decompressa come rapporto dei byte compressi.
  • none: Nessun limite di dimensione.

Impostare limiti di dimensione per la decompressione può aiutare a prevenire che richieste HTTP compresse in modo malevolo usino grandi quantità di memoria.

Pipelining

Il parametro supportPipelining abilita il supporto per il pipelining di richieste e risposte HTTP. Il valore predefinito è false.

// Supporta il pipelining HTTP.
app.http.server.configuration.supportPipelining = true

Versioni

Il parametro supportVersions controlla quali versioni HTTP il server utilizzerà. Per impostazione predefinita, Vapor supporterà sia HTTP/1 che HTTP/2 quando TLS è abilitato. Solo HTTP/1 è supportato quando TLS è disabilitato.

// Disabilita il supporto HTTP/1.
app.http.server.configuration.supportVersions = [.two]

TLS

Il parametro tlsConfiguration controlla se TLS (SSL) è abilitato sul server. Il valore predefinito è nil.

// Abilita 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))
)

Affinché questa configurazione venga compilata è necessario aggiungere import NIOSSL in cima al file di configurazione. Potrebbe anche essere necessario aggiungere NIOSSL come dipendenza nel file Package.swift.

Nome

Il parametro serverName controlla l'header Server nelle risposte HTTP in uscita. Il valore predefinito è nil.

// Aggiunge l'header 'Server: vapor' alle risposte.
app.http.server.configuration.serverName = "vapor"

Comando Serve

Per avviare il server di Vapor, usa il comando serve. Questo comando viene eseguito per impostazione predefinita se non vengono specificati altri comandi.

swift run App serve

Il comando serve accetta i seguenti parametri:

  • hostname (-H): Sovrascrive l'hostname configurato.
  • port (-p): Sovrascrive la porta configurata.
  • bind (-b): Sovrascrive l'hostname e la porta configurati, uniti da :.

Un esempio usando il flag --bind (-b):

swift run App serve -b 0.0.0.0:80

Usa swift run App serve --help per ulteriori informazioni.

Il comando serve ascolterà SIGTERM e SIGINT per uno shutdown graceful del server. Usa ctrl+c (^c) per inviare un segnale SIGINT. Quando il livello di log è impostato su debug o inferiore, verranno registrate informazioni sullo stato dello shutdown graceful.

Avvio Manuale

Il server di Vapor può essere avviato manualmente usando app.server.

// Avvia il server di Vapor.
try app.server.start()
// Richiede lo shutdown del server.
app.server.shutdown()
// Attende lo shutdown del server.
try app.server.onShutdown.wait()

Server

Il server che Vapor utilizza è configurabile. Come impostazione predefinita viene usato il server HTTP integrato.

app.servers.use(.http)

Server Personalizzato

Il server HTTP predefinito di Vapor può essere sostituito da qualsiasi tipo conforme a Server.

import Vapor

final class MyServer: Server {
    ...
}

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

I server personalizzati possono estendere Application.Servers.Provider per la sintassi con punto iniziale.

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

app.servers.use(.myServer)