У меня есть сервер 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?