サーバーエンジン
Ktorサーバーアプリケーションを実行するには、まずサーバーを作成し、設定する必要があります。 サーバー設定には、以下のような様々な設定が含まれます:
- ネットワークリクエストを処理するためのエンジン。
- サーバーへのアクセスに使用されるホストとポートの値。
- SSL設定。
サポートされているプラットフォーム
以下の表は、各エンジンでサポートされているプラットフォームを示しています:
| エンジン | プラットフォーム | HTTP/2 |
|---|---|---|
Netty | JVM | ✅ |
Jetty | JVM | ✅ |
Tomcat | JVM | ✅ |
CIO (Coroutine-based I/O) | JVM, Native, GraalVM, JavaScript, WasmJs | ✖️ |
ServletApplicationEngine | JVM | ✅ |
依存関係の追加
目的のエンジンを使用する前に、対応する依存関係をビルドスクリプトに追加する必要があります:
ktor-server-nettyktor-server-jetty-jakartaktor-server-tomcat-jakartaktor-server-cio
以下は、Nettyの依存関係を追加する例です:
サーバーの作成方法を選択する
Ktorサーバーアプリケーションは、2つの方法で作成および実行できます:
embeddedServerを使用して、コード内でサーバーパラメータを素早く渡すEngineMainを使用して、外部の application.conf または application.yaml ファイルから設定を読み込む
embeddedServer
embeddedServer() 関数は、特定のタイプのエンジンを作成するために使用されるエンジンファクトリを受け取ります。以下の例では、Netty ファクトリを渡して、Nettyエンジンでサーバーを実行し、8080 ポートでリッスンします:
import io.ktor.server.response.*
import io.ktor.server.routing.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
fun main(args: Array<String>) {
embeddedServer(Netty, port = 8080) {
routing {
get("/") {
call.respondText("Hello, world!")
}
}
}.start(wait = true)
}EngineMain
EngineMain は、サーバーを実行するためのエンジンを表します。以下のエンジンを使用できます:
io.ktor.server.netty.EngineMainio.ktor.server.jetty.jakarta.EngineMainio.ktor.server.tomcat.jakarta.EngineMainio.ktor.server.cio.EngineMain
サーバーの作成と起動
EngineMain.main() 関数は、選択したエンジンでサーバーを起動し、外部の設定ファイルで指定されたアプリケーションモジュールをロードするために使用されます。以下の例では、アプリケーションの main 関数がサーバーを起動します:
package com.example
import io.ktor.server.application.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)
fun Application.module() {
routing {
get("/") {
call.respondText("Hello, world!")
}
}
}ktor {
deployment {
port = 8080
}
application {
modules = [ com.example.ApplicationKt.module ]
}
}ktor:
deployment:
port: 8080
application:
modules:
- com.example.ApplicationKt.moduleビルドシステムのタスクを使用してサーバーを起動する必要がある場合は、必要な EngineMain をメインクラスとして設定する必要があります:
application {
mainClass.set("io.ktor.server.netty.EngineMain")
}mainClassName = "io.ktor.server.netty.EngineMain"<properties>
<main.class>io.ktor.server.netty.EngineMain</main.class>
</properties>起動せずにサーバーインスタンスを作成する
サーバーをすぐに起動するために EngineMain.main() を直接呼び出す以外に、サーバーを起動せずに EmbeddedServer インスタンスを返す EngineMain.createServer() を呼び出すこともできます。
このアプローチでは、サーバーがリクエストの受け付けを開始する前に、いつ .start() や .stop() を呼び出すか、あるいはサーバーに対して何らかの操作を行うかを制御できます。
// Nettyを使用した例
val server = io.ktor.server.netty.EngineMain.createServer(args)
// 追加の初期化、ロギング、インストルメンテーションなどを実行します
server.start(wait = true)エンジンの設定
このセクションでは、様々なエンジン固有のオプションを指定する方法を見ていきます。
コード内での設定
embeddedServer 関数では、configure パラメータを使用してエンジン固有のオプションを渡すことができます。このパラメータには、すべてのエンジンに共通で ApplicationEngine.Configuration クラスによって公開されているオプションが含まれます。
以下の例は、Netty エンジンを使用してサーバーを設定する方法を示しています。 configure ブロック内で、ホストとポートを指定するための connector を定義し、様々なサーバーパラメータをカスタマイズします:
connectors.add() メソッドは、指定されたホスト (127.0.0.1) とポート (8080) でコネクタを定義します。
これらのオプションに加えて、他のエンジン固有のプロパティを設定することもできます。
Jetty
Jetty固有のオプションは、 JettyApplicationEngineBase.Configuration クラスによって公開されています。
configureServer ブロック内でJettyサーバーを設定できます。これにより Server インスタンスにアクセスできます。
接続が閉じられるまでにアイドル状態でいられる時間を指定するには、idleTimeout プロパティを使用します。
設定ファイル内での設定
EngineMain を使用する場合、ktor.deployment グループ内ですべてのエンジンに共通のオプションを指定できます。
