swift - 为什么 Swift Kitura 服务器不终止某些线程?

标签 swift kitura

我在运行的 Swift 服务器上遇到了一些可重现的问题。这是一个多线程服务器,使用 Kitura。基本原理是:服务器运行一段时间后,下载请求开始需要客户端重试(通常重试三次)。来自客户端的尝试导致服务器线程不会终止。在服务器上,下载问题在日志中显示如下:

[INFO] REQUEST /DownloadFile: ABOUT TO END ...

然后请求永远不会终止。

我的服务器中的相关片段代码如下所示:

    // <snip>
    Log.info(message: "REQUEST \(request.urlURL.path): ABOUT TO END ...")

    do {
        try self.response.end()
        Log.info(message: "REQUEST \(request.urlURL.path): STATUS CODE: \(response.statusCode)")
    } catch (let error) {
        Log.error(message: "Failed on `end` in failWithError: \(error.localizedDescription); HTTP status code: \(response.statusCode)")
    }

    Log.info(message: "REQUEST \(request.urlURL.path): COMPLETED")
    // <snip>

也就是说,服务器显然似乎卡在对 end(Kitura 方法)的调用上。另请参阅https://github.com/crspybits/SyncServerII/blob/master/Sources/Server/Setup/RequestHandler.swift#L105

就在上次出现此问题之前,我在服务器日志中观察到以下内容:

[2017-07-12T15:31:23.302Z] [ERROR] [HTTPServer.swift:194 listen(listenSocket:socketManager:)] Error accepting client connection: Error code: 5(0x5), ERROR: SSL_accept, code: 5, reason: DH lib
[2017-07-12T15:31:23.604Z] [ERROR] [HTTPServer.swift:194 listen(listenSocket:socketManager:)] Error accepting client connection: Error code: 1(0x1), ERROR: SSL_accept, code: 1, reason: Could not determine error reason.
[2017-07-12T15:31:23.995Z] [ERROR] [HTTPServer.swift:194 listen(listenSocket:socketManager:)] Error accepting client connection: Error code: 1(0x1), ERROR: SSL_accept, code: 1, reason: Could not determine error reason.
[2017-07-12T15:40:32.941Z] [ERROR] [HTTPServer.swift:194 listen(listenSocket:socketManager:)] Error accepting client connection: Error code: 1(0x1), ERROR: SSL_accept, code: 1, reason: Could not determine error reason.
[2017-07-12T15:42:43.000Z] [VERBOSE] [HTTPServerRequest.swift:215 parsingCompleted()] HTTP request from=139.162.78.135; proto=https;
[INFO] REQUEST RECEIVED: /
[2017-07-12T16:32:38.479Z] [ERROR] [HTTPServer.swift:194 listen(listenSocket:socketManager:)] Error accepting client connection: Error code: 1(0x1), ERROR: SSL_accept, code: 1, reason: Could not determine error reason.

我不确定这是从哪里来的,因为我不确定我的客户是否正在生成这个。我没有用“/”明确向我的服务器发出请求。 (我偶尔会看到不属于我的客户端向我的服务器发出的请求 - 这可能是其中之一)。请注意,除了其中一条日志消息之外,所有日志消息均来自 Kitura,而不是直接来 self 的代码。我的日志消息是 [INFO] REQUEST RECEIVED:/

如果我是一个赌徒,我会说上述错误使我的服务器进入一种状态,之后我会看到这种下载/重试行为。

此时我唯一的解决方案是重新启动服务器。从那时起,问题不会立即发生。

想法?

最佳答案

我不确定这是否解决了根本问题,还是只是一种解决方法,但它似乎有效。对于问题中所述的服务器,我一直在使用 Kitura 的内置 SSL 支持。我现在已改用 NGINX 作为前端,不再使用 Kitura 的内置 SSL 支持。 NGINX 负责处理所有 HTTPS/SSL 详细信息。自从执行此操作(大约一个月前)以来,并且服务器在所有干预时间内都在运行,我还没有遇到此问题中报告的未终止问题。另请参阅https://github.com/crspybits/SyncServerII/issues/28

关于swift - 为什么 Swift Kitura 服务器不终止某些线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45094293/

相关文章:

swift - Ubuntu 16.04 上的错误 : cannot convert value of type 'ObjCBool' to expected argument type 'Bool' on Swift 4. 1.2 和 Kitura

swift - Kitura 每秒请求速度慢或低?

swift - 在 Bluemix 错误 : hidden symbol Foundation Operations 上部署 Swift 应用程序时出错

swift - 用于安排通知的唯一标识符,Swift 3 iOS 10

ios - Xcode 将 Swift Framework 导入 Objective C 应用程序时出现类型解析问题

ios - Swift:函数调用之间的区别

swift - 无法使用带有 Swift 3.1 的 Postgres 适配器构建 Kitura 服务器

swift - 如何修复我的导航栏后退按钮?

ios - 从另一个类向 GameScene 添加节点

swift - 有什么简单的方法可以远程调试在(开发)服务器上运行的快速(vapor/perfect/kitura)应用程序?