コンテンツにスキップ

Server

VaporにはSwiftNIO上に構築された高性能で非同期のHTTPサーバーが含まれています。このサーバーはHTTP/1、HTTP/2、およびWebSocketsなどのプロトコルアップグレードをサポートしています。サーバーはTLS(SSL)の有効化もサポートしています。

設定

VaporのデフォルトHTTPサーバーはapp.http.serverを介して設定できます。

// HTTP/2のみをサポート
app.http.server.configuration.supportVersions = [.two]

HTTPサーバーはいくつかの設定オプションをサポートしています。

ホスト名

ホスト名は、サーバーが新しい接続を受け入れるアドレスを制御します。デフォルトは127.0.0.1です。

// カスタムホスト名を設定
app.http.server.configuration.hostname = "dev.local"

サーバー設定のホスト名は、serveコマンドに--hostname-H)フラグを渡すか、app.server.start(...)hostnameパラメーターを渡すことでオーバーライドできます。

# 設定されたホスト名をオーバーライド
swift run App serve --hostname dev.local

ポート

ポートオプションは、指定されたアドレスでサーバーが新しい接続を受け入れるポートを制御します。デフォルトは8080です。

// カスタムポートを設定
app.http.server.configuration.port = 1337

Info

1024未満のポートにバインドするにはsudoが必要な場合があります。65535を超えるポートはサポートされていません。

サーバー設定のポートは、serveコマンドに--port-p)フラグを渡すか、app.server.start(...)portパラメーターを渡すことでオーバーライドできます。

# 設定されたポートをオーバーライド
swift run App serve --port 1337

バックログ

backlogパラメーターは、保留中の接続のキューの最大長を定義します。デフォルトは256です。

// カスタムバックログを設定
app.http.server.configuration.backlog = 128

アドレスの再利用

reuseAddressパラメーターは、ローカルアドレスの再利用を許可します。デフォルトはtrueです。

// アドレスの再利用を無効化
app.http.server.configuration.reuseAddress = false

TCP No Delay

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です。

// HTTPパイプライニングをサポート
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: .privateKey(try NIOSSLPrivateKey(file: "/path/to/key.pem", format: .pem))
)

この設定をコンパイルするには、設定ファイルの先頭にimport NIOSSLを追加する必要があります。また、Package.swiftファイルにNIOSSLを依存関係として追加する必要がある場合もあります。

名前

serverNameパラメーターは、送信されるHTTPレスポンスのServerヘッダーを制御します。デフォルトはnilです。

// レスポンスに 'Server: vapor' ヘッダーを追加
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以下に設定されている場合、正常なシャットダウンのステータスに関する情報がログに記録されます。

手動起動

Vaporのサーバーはapp.serverを使用して手動で起動できます。

// Vaporのサーバーを起動
try app.server.start()
// サーバーのシャットダウンをリクエスト
app.server.shutdown()
// サーバーのシャットダウンを待機
try app.server.onShutdown.wait()

サーバー

Vaporが使用するサーバーは設定可能です。デフォルトでは、組み込みのHTTPサーバーが使用されます。

app.servers.use(.http)

カスタムサーバー

Vaporのデフォルトのサーバーは、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)