HTTPS-сервер Python зависает с CLOSE_WAIT - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть сервер Python HTTPS, работающий в Linux, который предоставляет информацию об удаленном состоянии для другой службы.

Веб-страница содержит индикаторы состояния, которые обновляются один раз в секунду с помощью запроса AJAX GET, и есть только три или четыре пользователя, поэтому не высокая пропускная способность. Если браузер подключен к серверу в течение нескольких часов, сервер в конечном итоге зависнет и перестанет принимать запросы GET. Запуск netstat после хэнджа показывает 4-6 соединений https в состоянии CLOSE_WAIT и одно в состоянии ESTABLISHED. Установленное соединение не исчезает даже после закрытия браузера.

Сервер работает с Python 2.6.6, потому что это то, что установлено в Linux, но я попытался запустить с Python 2.7.15 с тем же результатом. ОС RHEL 6, ядро ​​2.6.32 64 бит.

Соответствующий код следует:

class AduWebServer(ThreadingMixIn, HTTPServer):
  pass

class AduRequestHandler(BaseHTTPRequestHandler):
  protocol_version = 'HTTP/1.1'

  def do_GET(self):
    try:
      if (len(self.path) > 15 and self.path[:15] == '/adu_get_status'):
        self.handleAduGetStatusRequest()
      elif (self.path == '/'):
        self.handleAduPage()
      elif (self.path == '/logo.png'):
        self.handleFile('image/png')
      elif (self.path == '/favicon.ico'):
        self.handleFile('image/x-icon')
      elif (self.path == '/refresh.js'):
        self.handleFile('text/javascript')
      else:
        self.send_error(404)
        logger.error('GET attempt on invalid page: ' + self.path)
    except Exception as msg:
      self.send_error(500)
      logger.error('GET exception: ' + str(msg))

  def handleAduGetStatusRequest(self):
    response = self.getAduStatus()
    self.send_response(200)
    self.send_header('Content-length', len(response))
    self.end_headers()
    self.wfile.write(response)

  def handleAduPage(self):
    aduPage = AduPage()
    self.send_response(200)
    self.send_header('Content-type', 'text/html')
    self.send_header('Content-length', len(aduPage.response))
    self.end_headers()
    self.wfile.write(aduPage.response)

  def handleFile(self, contentType):
    filePath = os.getcwd() + '/' + self.path
    f = open(filePath, 'rb')
    response = f.read()
    self.send_response(200)
    self.send_header('Content-type', contentType)
    self.send_header('Content-length', len(response))
    self.end_headers()
    self.wfile.write(response)

handler = AduRequestHandler
httpd = AduWebServer(('', 443), handler)
httpd.socket = ssl.wrap_socket(httpd.socket,
                               keyfile='keyfile',
                               certfile='crtfile',
                               server_side=True)
httpd.serve_forever()

Кто-нибудь имеет представление о том, что приводит к зависанию сервера с CLOSE_WAITs?

...