Многопоточный веб-сервер https прекращает работу - PullRequest
0 голосов
/ 03 августа 2020

Я создал код многопоточности 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...