У меня есть проблема, с которой я боролся уже несколько дней.
У меня есть простой ThreadedHTTPServer over SSL, который обслуживает небольшое количество запросов, поступающих в течение дня.
Каждые случайные 10 или около того соединений серверный поток зависает (у меня есть запланированный поток, который работает параллельно с серверным потоком, но он продолжает работать нормально, пока серверный поток зависает).
Когда он завис, я не могу получить больше, чем Client Hello при SSL-рукопожатии при попытке соединения с клиентом openssl.
openssl s_client -connect HOST:7813 -prexit
Вещи, которые я пробовал:
- Я подумал, что, возможно, установление тайм-аута на соединениях поможет, но не сигара ... да, это приведет к истечению времени ожидания установившихся соединений, но если повесить рукопожатие, это не даст никакого эффекта.
Как:
class ForeMan(BaseHTTPRequestHandler):
def setup(self):
self.request.settimeout(1) # no
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
def get_request(self): #no
...
sock.settimeout(1)
def server_bind(self):#no
....
self.socket.settimeout(1)
Отключить разрешение DNS, выполняемое BaseHTTPRequestHandler, путем переопределения функции address_string () ... возможно, немного помогло, если разрешение DNS было по какой-то причине запаздывающим, но не решало зависание рукопожатия SSL
Я пытался проверить, возможно ли, что используются версии TLS, но разные завитки с --tlv1.x не привели к зависанию. Это происходило только случайным образом, и когда определенные клиенты браузера делали запрос.
Изменение порта для HTTPServer на 443 вместо 7813. Я искал максимум и минимум, но ничего из того, что я видел в билетах, не подразумевало, что это может быть проблемой. Полагаю, единственное, что я заметил, было то, что яростно указано, что http.server для python не должен использоваться для производства ...
Разрешение
Ничего из вышеперечисленного не сработало. На данный момент самый простой подход состоит в том, чтобы не давать Python ответственности за обработку SSL-соединений и делегирование этого Nginx.