我正在运行的Swift服务器上有一个可重现的问题。这是一个使用Kitura的多线程服务器。基础知识是:服务器运行一段时间后,下载请求开始需要从客户端重试(通常为3次重试)。客户端的尝试导致服务器线程未终止。在服务器上,下载问题在日志中显示如下:
[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,而不是直接来自我的代码。我的日志消息是
[INFO] REQUEST RECEIVED: /
。如果我是一个博彩人,我会说上述错误使服务器进入一种状态,此后,我会看到这种下载/重试行为。
此时,我唯一的解决方案是重新启动服务器。从那时起,问题不会立即发生。
有什么想法吗?
最佳答案
我不确定这是否解决了根本问题,或者只是一种解决方法,但它似乎正在工作。使用问题中所述的服务器,我一直在使用Kitura的内置SSL支持。我现在已经切换到使用NGINX作为前端,并且不再使用Kitura的内置SSL支持。 NGINX处理所有HTTPS / SSL详细信息。自从执行此操作(大约一个月前)以来,由于服务器在所有这段时间内都处于运行状态,因此我没有遇到此问题中报告的not terminating
问题。另见https://github.com/crspybits/SyncServerII/issues/28
关于swift - Swift Kitura Server为什么不终止某些线程?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45094293/