You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Ktor绑定到Unix Socket?已试Netty、Tomcat未果

Ktor绑定Unix Socket解决方案

Netty引擎实现方式

Netty原生支持Unix域套接字,Ktor可通过自定义ServerBootstrap完成绑定:

import io.ktor.server.netty.*
import io.netty.bootstrap.ServerBootstrap
import io.netty.channel.ChannelOption
import io.netty.channel.unix.DomainSocketAddress
import io.netty.channel.epoll.EpollEventLoopGroup
import io.netty.channel.epoll.EpollServerDomainSocketChannel

fun main() {
    val socketPath = "/tmp/ktor-unix.sock"
    val bossGroup = EpollEventLoopGroup(1)
    val workerGroup = EpollEventLoopGroup()

    val bootstrap = ServerBootstrap()
        .group(bossGroup, workerGroup)
        .channel(EpollServerDomainSocketChannel::class.java)
        .childOption(ChannelOption.SO_KEEPALIVE, true)
        .localAddress(DomainSocketAddress(socketPath))

    embeddedServer(Netty, environment = applicationEngineEnvironment {
        module {
            routing {
                get("/") {
                    call.respondText("Hello from Unix Socket!")
                }
            }
        }
    }, configure = {
        this.bootstrap = bootstrap
    }).start(wait = true)
}

需额外引入Netty的epoll依赖(以Gradle为例):

implementation "io.netty:netty-transport-native-epoll:4.1.94.Final:linux-x86_64"

Tomcat引擎实现方式

Tomcat 9.0.41+版本支持Unix Socket,Ktor可直接操作底层Tomcat实例配置Connector:

import io.ktor.server.tomcat.*
import org.apache.catalina.connector.Connector
import org.apache.coyote.http11.Http11NioProtocol

fun main() {
    val socketPath = "/tmp/ktor-unix.sock"
    embeddedServer(Tomcat) {
        val connector = Connector("org.apache.coyote.http11.Http11NioProtocol")
        connector.apply {
            setProperty("unixSocket", socketPath)
            setProperty("unixSocketPermissions", "777")
            port = -1 // 禁用TCP端口,仅保留Unix Socket
        }
        server.service.addConnector(connector)

        routing {
            get("/") {
                call.respondText("Hello from Tomcat Unix Socket!")
            }
        }
    }.start(wait = true)
}

验证方法

绑定完成后,可通过curl测试服务:

curl --unix-socket /tmp/ktor-unix.sock http://localhost/

内容的提问来源于stack exchange,提问作者OwOchlé

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:08:14