服务器¶
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
命令将侦听 SIGTERM
和 SIGINT
信号,以正常关闭服务器。使用 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)