Запускаем в werkzeug.исключения.Клиент отключен при использовании gunicorn

#python #flask #gunicorn #werkzeug

Вопрос:

Я использую сервер Gunicorn wsgi для обслуживания моего приложения flask в производстве. Команда для запуска приложения является

 gunicorn -t600 --workers 2 --max-requests 1200 --bind 0.0.0.0:8000 index:app
 

Сервер часто выдает следующее исключение.

 werkzeug.exceptions.ClientDisconnected: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
 

Я проверил проблему в хранилище колб. Предложение состоит в том, чтобы не использовать сервер Werkzeug wsgi в производстве, так как он не истощает входные данные.

Кажется, я не могу понять, почему я сталкиваюсь с той же проблемой при запуске своего приложения с помощью gunicorn. Вот полная трассировка стека исключения.

 Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     loggerInfo('request.files={}'.format(request.files))
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/local.py", line 347, in __getattr__
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     return getattr(self._get_current_object(), name)
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/utils.py", line 90, in __get__
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     value = self.func(obj)
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py", line 514, in files
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     self._load_form_data()
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/flask/wrappers.py", line 88, in _load_form_data
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     RequestBase._load_form_data(self)
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py", line 319, in _load_form_data
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     self._get_stream_for_parsing(), mimetype, content_length, options
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/formparser.py", line 232, in parse
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     return parse_func(self, stream, mimetype, content_length, options)
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/formparser.py", line 131, in wrapper
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     return f(self, stream, *args, **kwargs)
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/formparser.py", line 253, in _parse_multipart
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     form, files = parser.parse(stream, boundary, content_length)
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/formparser.py", line 584, in parse
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     return self.cls(form), self.cls(files)
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/datastructures.py", line 419, in __init__
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     for key, value in mapping or ():
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/formparser.py", line 582, in <genexpr>
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     form = (p[1] for p in formstream if p[0] == "form")
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/formparser.py", line 537, in parse_parts
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     for ellt, ell in self.parse_lines(file, boundary, content_length):
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/formparser.py", line 480, in parse_lines
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     for line in iterator:
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/wsgi.py", line 761, in make_line_iter
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     for item in _iter_basic_lines():
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/wsgi.py", line 737, in _iter_basic_lines
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     new_data = next(_iter, "")
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/wsgi.py", line 681, in _make_chunk_iter
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     item = _read(buffer_size)
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/wsgi.py", line 943, in read
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     return self.on_disconnect()
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:   File "/home/ubuntu/ca/venv_dc/lib/python3.6/site-packages/werkzeug/wsgi.py", line 911, in on_disconnect
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]:     raise ClientDisconnected()
Sep 29 10:14:56 ip-10-2-1-136 gunicorn[16388]: werkzeug.exceptions.ClientDisconnected: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
 

Комментарии:

1. Сталкиваетесь ли вы с проблемой при работе с gunicorn на вашем местном?

2. @shoaib30 Нет, не может воспроизвести это в локальной среде, и на сервере prod это происходит без шаблона.

3. Какая-либо конкретная конфигурация на рабочем сервере? nginx/ apache Может ли на самом деле быть сетевая проблема с сервером, который отключился во время обработки запроса?

4. Нет, мы не используем никаких обратных прокси-серверов. Я не вижу причины, по которой сеть отключалась бы при обработке запроса

5. Еще один момент, о котором стоит упомянуть, заключается в том, что мы используем этот сервер для выполнения длительных задач, таких как обработка изображений. Я не уверен, что это имеет значение @shoaib30