Przejdź do treści

Server

Vapor includes a high-performance, asynchronous HTTP server built on SwiftNIO. This server supports HTTP/1, HTTP/2, and protocol upgrades like WebSockets. The server also supports enabling TLS (SSL).

Configuration

Vapor's default HTTP server can be configured via app.http.server.

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

The HTTP server supports several configuration options.

Hostname

The hostname controls which address the server will accept new connections on. The default is 127.0.0.1.

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

The server configuration's hostname can be overridden by passing the --hostname (-H) flag to the serve command or by passing the hostname parameter to app.server.start(...).

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

Port

The port option controls which port at the specified address the server will accept new connections on. The default is 8080.

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

Info

sudo may be required for binding to ports less than 1024. Ports greater than 65535 are not supported.

The server configuration's port can be overridden by passing the --port (-p) flag to the serve command or by passing the port parameter to app.server.start(...).

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

Backlog

The backlog parameter defines the maximum length for the queue of pending connections. The default is 256.

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

Reuse Address

The reuseAddress parameter allows for reuse of local addresses. Defaults to true.

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

TCP No Delay

Enabling the tcpNoDelay parameter will attempt to minimize TCP packet delay. Defaults to true.

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

Response Compression

The responseCompression parameter controls HTTP response compression using gzip. The default is .disabled.

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

To specify an initial buffer capacity, use the initialByteBufferCapacity parameter.

.enabled(initialByteBufferCapacity: 1024)

Request Decompression

The requestDecompression parameter controls HTTP request decompression using gzip. The default is .disabled.

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

To specify a decompression limit, use the limit parameter. The default is .ratio(10).

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

Available options are:

  • size: Maximum decompressed size in bytes.
  • ratio: Maximum decompressed size as ratio of compressed bytes.
  • none: No size limits.

Setting decompression size limits can help prevent maliciously compressed HTTP requests from using large amounts of memory.

Pipelining

The supportPipelining parameter enables support for HTTP request and response pipelining. The default is false.

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

Versions

The supportVersions parameter controls which HTTP versions the server will use. By default, Vapor will support both HTTP/1 and HTTP/2 when TLS is enabled. Only HTTP/1 is supported when TLS is disabled.

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

TLS

The tlsConfiguration parameter controls whether TLS (SSL) is enabled on the server. The default is nil.

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

For this configuration to compile you need to add import NIOSSL at the top of your configuration file. You also might need to add NIOSSL as a dependency in your Package.swift file.

Name

The serverName parameter controls the Server header on outgoing HTTP responses. The default is nil.

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

Serve Command

To start up Vapor's server, use the serve command. This command will run by default if no other commands are specified.

swift run App serve

The serve command accepts the following parameters:

  • hostname (-H): Overrides configured hostname.
  • port (-p): Overrides configured port.
  • bind (-b): Overrides configured hostname and port joined by :.

An example using the --bind (-b) flag:

swift run App serve -b 0.0.0.0:80

Use swift run App serve --help for more information.

The serve command will listen for SIGTERM and SIGINT to gracefully shutdown the server. Use ctrl+c (^c) to send a SIGINT signal. When the log level is set to debug or lower, information about the status of graceful shutdown will be logged.

Manual Start

Vapor's server can be started manually using 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()

Servers

The server Vapor uses is configurable. By default, the built in HTTP server is used.

app.servers.use(.http)

Custom Server

Vapor's default HTTP server can be replaced by any type conforming to Server.

import Vapor

final class MyServer: Server {
    ...
}

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

Custom servers can extend Application.Servers.Provider for leading-dot syntax.

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

app.servers.use(.myServer)