#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