跳转至

服务器

Vapor 包含一个基于 SwiftNIO 构建的高性能异步 HTTP 服务器。该服务器支持 HTTP/1、HTTP/2 和协议升级,如 WebSockets。服务器还支持启用 TLS (SSL)。

配置

Vapor 的默认 HTTP 服务器可以通过 app.http.server 来配置。

// 仅支持 HTTP/2
app.http.server.configuration.supportVersions = [.two]

HTTP 服务器支持多种配置选项。

主机名

hostname 控制服务器将在哪个地址上接受新连接。默认地址为127.0.0.1

// 配置自定义主机名
app.http.server.configuration.hostname = "dev.local"

终端运行 serve 命令添加 --hostname (-H) 标志来修改服务器主机名或将 hostname 参数传递给 app.server.start(...) 来修改配置。

# 重写主机名配置
swift run App serve --hostname dev.local

端口

port 选项控制服务器将在指定地址上的哪个端口接受新连接。默认值为8080

// 配置自定义端口。
app.http.server.configuration.port = 1337

信息

绑定小于1024的端口可能需要 sudo 提权。不支持大于65535的端口。

终端运行 serve 命令添加 --port (-p) 标志来修改服务器端口或将 port 参数传递给 app.server.start(...) 来修改配置。

# 重写端口配置
swift run App serve --port 1337

Backlog

backlog 参数定义待处理连接队列的最大长度。默认值为256

// 自定义积压队列长度
app.http.server.configuration.backlog = 128

地址复用

reuseAddress 参数允许重用本地地址。默认为 true

// 禁用地址复用
app.http.server.configuration.reuseAddress = false

TCP 无延迟

启用 tcpNoDelay 参数将尝试 TCP 数据包延迟最小化。默认为 true

// 降低数据包延迟。
app.http.server.configuration.tcpNoDelay = true

响应压缩

responseCompression 参数使用 gzip 控制 HTTP 响应压缩。默认值为 .disabled

// 启用 HTTP 响应压缩。
app.http.server.configuration.responseCompression = .enabled

要指定初始缓冲区容量,请使用 initialByteBufferCapacity 参数。

.enabled(initialByteBufferCapacity: 1024)

请求解压

requestDecompression 参数使用 gzip 控制 HTTP 请求解压。默认值为 .disabled

// 启用 HTTP 请求解压
app.http.server.configuration.requestDecompression = .enabled

要指定解压限制,请使用 limit 参数。默认值为 .ratio(10)

// 无解压大小限制
.enabled(limit: .none)

可用选项有:

  • size:以字节为单位的最大解压缩大小。
  • ratio:最大解压缩大小为压缩字节的比率。
  • none:没有大小限制。

设置解压缩大小限制有助于防止恶意压缩的 HTTP 请求使用大量内存。

管道

supportPipelining 参数启用对 HTTP 请求和响应管道的支持。默认值为 false

// 启用管道支持。
app.http.server.configuration.supportPipelining = true

版本

supportVersions 参数控制服务器使用的 HTTP 版本。默认情况下,启用 TLS 时,Vapor 将同时支持 HTTP/1 和 HTTP/2。禁用 TLS 时仅支持 HTTP/1。

// 禁用 HTTP/1 。
app.http.server.configuration.supportVersions = [.two]

TLS

tlsConfiguration 参数控制是否在服务器上启用 TLS (SSL)。默认值为 nil

// 启用 TLS.
app.http.server.configuration.tlsConfiguration = .makeServerConfiguration(
    certificateChain: try NIOSSLCertificate.fromPEMFile("/path/to/cert.pem").map { .certificate($0) },
    privateKey: .file("/path/to/key.pem")
)

要编译此配置,你需要在配置文件的顶部添加 import NIOSSL 导入包。你可能还需要在 Package.swift 文件中添加 NIOSSL 依赖项。

名称

serverName 参数控制 Server 传出 HTTP 响应的报头。默认值为 nil

// 添加 'Server: vapor' 到响应头。
app.http.server.configuration.serverName = "vapor"

服务命令

要启动 Vapor 的服务器,请在终端使用 serve 命令。如果没有指定其他命令,该命令将默认运行。

swift run App serve

serve 命令接受以下参数:

  • hostname (-H):重写主机名配置。
  • port (-p):重写端口号配置。
  • bind (-b):重写由:连接的主机名和端口号配置。

下面是使用 --bind (-b) 标志的一个示例:

swift run App serve -b 0.0.0.0:80

使用 swift run App serve --help 以获取更多信息。

serve 命令将侦听 SIGTERMSIGINT 信号,以正常关闭服务器。使用 ctrl+c (^c) 发送 SIGINT 信号。当日志级别设置为 debug 或更低时,将记录有关安全关机状态的信息。

手动启动

Vapor 的服务器可以使用 app.server 手动启动。

// 启动 Vapor 服务器。
try app.server.start()
// 请求服务器关闭。
app.server.shutdown()
// 等待服务器关闭。
try app.server.onShutdown.wait()

服务器

Vapor 使用的服务器是可配置的。默认情况下,使用内置的 HTTP 服务器。

app.servers.use(.http)

自定义服务器

Vapor 的默认 HTTP 服务器可以替换为任何遵循 Server 的服务器。

import Vapor

final class MyServer: Server {
    ...
}

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

自定义服务器可以扩展 Application.Servers.Provider 以使用点语法。

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

app.servers.use(.myServer)