Я создал код многопоточности HTTPS, почерпнутый из Stackoverflow, который, похоже, работает нормально.
Однако, когда в пиковое время, когда он получил около 93 запросов за 27 секунд, он перестал работать. Он остановил средний l oop кода open_cv, вызванный в get_input_img
Аналогичный код Python3 с использованием Websocket работает отлично без каких-либо проблем.
В то же время я нахожу эту запись in syslog
:
Aug 3 12:00:15 ubuntu-s-4vcpu-8gb-blr1-01 kernel: [131481.449818] TCP: request_sock_TCP: Possible SYN flooding on port 443. Sending cookies. Check SNMP counters.
Все, что я могу найти в файле журнала, это «Прервано» после отсутствия ответа.
Он получает данные изображения, затем записывает их во временный файл и вызвать модуль python, который возвращает некоторый код, который затем отправляется обратно клиенту.
Но он останавливается, когда там слишком много запросов.
Что может быть не так?:
from http.server import HTTPServer, BaseHTTPRequestHandler
from socketserver import ThreadingMixIn
import threading
import urllib.parse
import cgi
import tempfile
import base64
from common import *
from datetime import datetime
print( datetime.now());
gg_hashmap = getHash()
def dump(obj):
for attr in dir(obj):
print("obj.%s = %r" % (attr, getattr(obj, attr)))
class PostHandler(BaseHTTPRequestHandler):
def handle(self):
try:
BaseHTTPRequestHandler.handle(self)
except :
pass
def do_POST(self):
try:
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD': 'POST',
'CONTENT_TYPE': self.headers['Content-Type'],
})
self.send_response(200)
self.send_header("Content-type", "text/html")
self.send_header("Access-Control-Allow-Origin", "*")
self.end_headers()
for field in form.keys():
field_item = form[field]
if field_item.filename:
file_data = field_item.file.read()
file_len = len(file_data)
del file_data
self.wfile.write('\tUploaded %s as "%s" (%d bytes)\n' % \
(field, field_item.filename, file_len))
else:
pass
if ('base64' in form and 'license' in form):
print("license=",form['license'].value);
global gg_hashmap
file_content = form['base64'].value
try:
_, temp_file_path = tempfile.mkstemp(prefix='photo', suffix='jpg')
with open(temp_file_path, 'wb') as w:
w.write(base64.b64decode (file_content))
input_hashes = get_input_img(temp_file_path)
all_letters = ""
if input_hashes != None:
for inp_hash in input_hashes:
lowest = 1000
lowest_letter = ''
for letter, arr in gg_hashmap.items():
for hashval in arr:
if int(inp_hash - hashval) < lowest:
lowest = int(inp_hash - hashval)
lowest_letter = letter
all_letters += lowest_letter
self.wfile.write(bytes(all_letters, "utf8"))
except Exception as e:
print("exception3 caught")
print(e)
print(str(e))
return
except:
print("caught unknown exception")
def do_GET(self):
self.send_response(200)
self.end_headers()
message = threading.currentThread().getName()
self.wfile.write(bytes(message,'utf-8'))
self.wfile.write('\n')
return
class ThreadingSimpleServer(ThreadingMixIn, HTTPServer):
pass
def run():
port=443
server = ThreadingSimpleServer(('0.0.0.0', port), PostHandler)
import ssl
server.socket = ssl.wrap_socket(server.socket, keyfile='./ssl/key.pem', certfile='./ssl/public.pem'
, ca_certs="./ssl/bund.ca-bundle" , server_side=True)
server.serve_forever()
if __name__ == '__main__':
run()