본문으로 건너뛰기

서버#

Vapor에는 SwiftNIO 기반으로 만들어진 고성능 비동기 HTTP 서버가 내장되어 있습니다. 이 서버는 HTTP/1, HTTP/2, 그리고 WebSockets와 같은 프로토콜 업그레이드를 지원합니다. 또한 TLS(SSL) 활성화도 지원합니다.

설정#

Vapor의 기본 HTTP 서버는 app.http.server를 통해 설정할 수 있습니다.

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

HTTP 서버는 여러 가지 설정 옵션을 지원합니다.

호스트네임#

호스트네임은 서버가 새로운 연결을 수락할 주소를 결정합니다. 기본값은 127.0.0.1입니다.

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

서버 설정의 호스트네임은 serve 커맨드에 --hostname (-H) 플래그를 전달하거나 app.server.start(...)hostname 파라미터를 전달하여 재정의할 수 있습니다.

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

포트#

포트 옵션은 지정된 주소에서 서버가 새로운 연결을 수락할 포트를 결정합니다. 기본값은 8080입니다.

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

Info

1024보다 작은 포트에 바인딩하려면 sudo가 필요할 수 있습니다. 65535보다 큰 포트는 지원되지 않습니다.

서버 설정의 포트는 serve 커맨드에 --port (-p) 플래그를 전달하거나 app.server.start(...)port 파라미터를 전달하여 재정의할 수 있습니다.

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

Backlog#

backlog 파라미터는 대기 중인 연결 큐의 최대 길이를 정의합니다. 기본값은 256입니다.

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

주소 재사용#

reuseAddress 파라미터는 로컬 주소의 재사용을 허용합니다. 기본값은 true입니다.

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

TCP No Delay#

tcpNoDelay 파라미터를 활성화하면 TCP 패킷 지연을 최소화하려고 시도합니다. 기본값은 true입니다.

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

응답 압축#

responseCompression 파라미터는 gzip을 사용한 HTTP 응답 압축을 제어합니다. 기본값은 .disabled입니다.

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

초기 버퍼 용량을 지정하려면 initialByteBufferCapacity 파라미터를 사용하세요.

.enabled(initialByteBufferCapacity: 1024)

요청 압축 해제#

requestDecompression 파라미터는 gzip을 사용한 HTTP 요청 압축 해제를 제어합니다. 기본값은 .disabled입니다.

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

압축 해제 제한을 지정하려면 limit 파라미터를 사용하세요. 기본값은 .ratio(10)입니다.

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

사용 가능한 옵션은 다음과 같습니다.

  • size: 압축 해제된 최대 크기(바이트).

  • ratio: 압축된 바이트 대비 압축 해제된 최대 크기 비율.

  • none: 크기 제한 없음.

압축 해제 크기 제한을 설정하면 악의적으로 압축된 HTTP 요청이 많은 양의 메모리를 사용하는 것을 방지하는 데 도움이 됩니다.

파이프라이닝#

supportPipelining 파라미터는 HTTP 요청 및 응답 파이프라이닝 지원을 활성화합니다. 기본값은 false입니다.

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

버전#

supportVersions 파라미터는 서버가 사용할 HTTP 버전을 제어합니다. 기본적으로 Vapor는 TLS가 활성화된 경우 HTTP/1과 HTTP/2를 모두 지원합니다. TLS가 비활성화된 경우에는 HTTP/1만 지원됩니다.

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

TLS#

tlsConfiguration 파라미터는 서버에서 TLS(SSL)를 활성화할지 여부를 제어합니다. 기본값은 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))
)

이 설정이 컴파일되려면 설정 파일 맨 위에 import NIOSSL을 추가해야 합니다. 또한 Package.swift 파일에 NIOSSL을 의존성으로 추가해야 할 수도 있습니다.

이름#

serverName 파라미터는 나가는 HTTP 응답의 Server 헤더를 제어합니다. 기본값은 nil입니다.

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

Serve 커맨드#

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를 수신 대기합니다. SIGINT 신호를 보내려면 ctrl+c (^c)를 사용하세요. 로그 레벨이 debug 이하로 설정된 경우, 정상 종료(graceful shutdown) 상태에 대한 정보가 로그로 기록됩니다.

수동 시작#

Vapor의 서버는 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()

서버들#

Vapor가 사용하는 서버는 설정 가능합니다. 기본적으로 내장 HTTP 서버가 사용됩니다.

app.servers.use(.http)

커스텀 서버#

Vapor의 기본 HTTP 서버는 Server를 준수하는 어떤 타입으로도 교체할 수 있습니다.

import Vapor

final class MyServer: Server {
    ...
}

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

커스텀 서버는 leading-dot 문법을 사용할 수 있도록 Application.Servers.Provider를 확장할 수 있습니다.

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

app.servers.use(.myServer)
이 페이지 편집