Как настроить сервер uWsgi для защиты от ошибки нечитаемой почты?

В этом проблема:

  File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/six.py", line 535, in next
    return type(self).__next__(self)
  File "/app/.heroku/python/lib/python2.7/site-packages/django/http/multipartparser.py", line 344, in __next__
    output = next(self._producer)
  File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/six.py", line 535, in next
    return type(self).__next__(self)
  File "/app/.heroku/python/lib/python2.7/site-packages/django/http/multipartparser.py", line 406, in __next__
    data = self.flo.read(self.chunk_size)
  File "/app/.heroku/python/lib/python2.7/site-packages/django/http/request.py", line 267, in read
    six.reraise(UnreadablePostError, UnreadablePostError(*e.args), sys.exc_info()[2])
  File "/app/.heroku/python/lib/python2.7/site-packages/django/http/request.py", line 265, in read
    return self._stream.read(*args, **kwargs)
  File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 59, in read
    result = self.buffer + self._read_limited(size - len(self.buffer))
  File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 47, in _read_limited
    result = self.stream.read(size)
UnreadablePostError: error during read(65536) on wsgi.input

Моя текущая конфигурация читается следующим образом:

[uwsgi]
http-socket = :$(PORT)
master = true
processes = 4
die-on-term = true
module = app.wsgi:application
memory-report = true
chunked-input-limit = 25000000
chunked-input-timeout = 300
socket-timeout = 300

Python: 2.7.x | uWsgi: 2.0.10

И чтобы сделать проблему еще более конкретной, это происходит, когда я обрабатываю изображения синхронно вместе с загрузкой изображения. Я знаю, что в идеале я должен это делать, используя сельдерей, но из-за бизнес-требований я не могу этого сделать. Поэтому нужно настроить тайм-аут таким образом, чтобы он позволял мне принимать большой файл изображения, обрабатывать его и затем возвращать ответ.

Любой свет на вопрос будет чрезвычайно полезен. Спасибо.

Ответ 1

Ошибка, указанная в описании, не является полной картиной; соответствующая часть - это запись лота:

[uwsgi-body-read] Error reading 65536 bytes … message: Client closed connection uwsgi_response_write_body_do() TIMEOUT

Эта конкретная ошибка возникает, потому что (скорее всего) клиент или что-то между ним и uWSGI прервал запрос.

Для этого существует ряд возможных причин:

  • Багги-клиент
  • Фильтрация на сетевом уровне (DPI или некорректный брандмауэр)
  • Ошибки/неправильная настройка на сервере перед uWSGI

Последнее описано в в документах uWSGI:

Если вы планируете размещать uWSGI за прокси-сервером, убедитесь, что он поддерживает chunked входные запросы (или, как правило, необработанные HTTP-запросы).

Чтобы проверить, действительно ли ваша проблема не в uWSGI, попробуйте загрузить файл через консоль на сервере, на котором размещено ваше приложение uWSGI. Удалите конечную точку HTTP напрямую, минуя nginx/haproxy и друзей.