Почему сервер 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
(метод Китуры). Смотрите также https://github.com/crspybits/SyncServerII/blob/master/Sources/Server/Setup/RequestHandler.swift
Непосредственно перед тем, как эта проблема возникла в прошлый раз, я заметил следующее в своем журнале сервера:
[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: /
,
Если бы я был игроком, делающим ставки, я бы сказал, что вышеперечисленные ошибки приводят мой сервер в состояние, при котором после этого я вижу поведение загрузки / повторной попытки.
Мое единственное решение на этом этапе - перезагрузить сервер. С этого момента проблема не возникает сразу.
Мысли?
1 ответ
Я не уверен, решает ли это корневую проблему, или это просто обходной путь, но, похоже, он работает. С сервером, как указано в вопросе, я использовал встроенную поддержку SSL Kitura. Теперь я перешел на использование NGINX в качестве внешнего интерфейса и больше не использую встроенную поддержку SSL Kitura. NGINX заботится обо всех деталях HTTPS/SSL. С тех пор, как я сделал это (около месяца назад) и сервер работал все это время, я не испытывал not terminating
проблема сообщается в этом вопросе. Смотрите также https://github.com/crspybits/SyncServerII/issues/28