Nginx UWSGI ответы усечены

Я попытался написать веб-сервис в шутку сегодня на http://dont-tread-on-memes.controversial.io/. Это колба приложение, которое обслуживает довольно большие изображения. Приложение Flask хорошо работает само по себе, как и независимый сервер uWSGI, но когда я пытаюсь подключить uWSGI к NGINX через uwsgi_passВнезапно каждый второй запрос усекается на 9,99 КБ во всех браузерах.

После прочтения о подобном усечении с proxy_pass Я старался:

  1. настройка uwsgi_buffering в off в моем конфигурационном файле
  2. Увеличение размера буфера до 1024k с uwsgi_buffers 1024 1024k; uwsgi_buffer_size 1024k;
  3. sendfile: off
  4. Проверка прав доступа к файлу буфера (все файлы в /var/lib/uwsgi принадлежат www-data пользователь и www-data группа, так что я думаю, что мои разрешения хорошие.)

Я остался с моим текущим конфигом, который все еще показывает проблему:

server {
    listen 80;
    server_name dont-tread-on-memes.controversial.io;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/var/www/dont-tread-on-memes/dont_tread_on_memes.sock;
        uwsgi_buffers 1024 1024k;
        uwsgi_buffer_size 1024k;
    }
}

Самое странное, что эта проблема появляется только при каждом втором запросе. Это должно быть связано с кешем NGINX, так как я не использую несколько экземпляров NGINX или что-то еще. Тем не менее, это должно быть как-то связано с моей конфигурацией NGINX, так как uWSGI, работающий сам по себе, не представляет проблемы.

Любые мысли о том, что может быть причиной этой проблемы, и как это исправить?

3 ответа

Это почти всегда означает, что есть проблема с вашими изображениями (т. Е. В нижней части отсутствуют данные). Я обработал образы> 25 МБ, используя PIL (при условии, что у вас достаточно ОЗУ), и он работает нормально Обходной путь здесь может работать для вас. Скопируйте и вставьте для удобства чтения:

if img and img.meta_type == 'Image':
    pilImg = PIL.Image.open( StringIO(str(img.data)) )
elif imgData:
    pilImg = PIL.Image.open( StringIO(imgData) )

try:
    pilImg.load()
except IOError:
    pass # You can always log it to logger

После двойной проверки, что uwsgi Команда, с которой я тестировал, соответствовала всем опциям, которые я предоставил в моем .ini файл, я понял, что мой .ini файл содержал processes = 5 в то время как uwsgi Команда, с которой я тестировал, не была. Если я добавлю --processes=5 к моему uwsgi Команда, я могу воспроизвести проблему усечения при каждом попадании, а не только при каждом втором запросе. Каждый раз, когда я начинаю uwsgi сервер с --processes=5первый запрос завершается успешно, второй возвращает 500, а все последующие запросы усекаются до 9,99 МБ со следующей ошибкой в ​​консоли:

[2017-01-08 04:16:08,959] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.4/dist-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "./flaskapp.py", line 13, in main
    flag = dont_tread_on_memes.dont_me(caption)
  File "./dont_tread_on_memes/__init__.py", line 30, in dont_me
    return tread_on("don't {} me".format(phrase))
  File "./dont_tread_on_memes/__init__.py", line 16, in tread_on
    flag = BLANK_FLAG.copy()
  File "/usr/local/lib/python3.4/dist-packages/PIL/Image.py", line 1010, in copy
    self.load()
  File "/usr/local/lib/python3.4/dist-packages/PIL/ImageFile.py", line 226, in load
    "(%d bytes not processed)" % len(b))
OSError: image file is truncated (0 bytes not processed)

Я подозреваю, что это проблема с подушкой и способом uwsgi обрабатывает резьбу Возможно, поведение каждого другого запроса было связано с тем, как uwsgi решает порождать новые процессы и убивать старые процессы или из-за кэширования NGINX. В любом случае, я исправил проблему с усечением.

Я также нашел это на StackOverflow от кого-то с моей той же проблемой.

Если кто-то еще может дать ответ о том, почему это произошло, или ответ о том, как я могу как решить эту проблему, так и позволить uwsgi порождая несколько процессов, я, безусловно, считаю это более полным ответом и принимаю его.

У меня была аналогичная проблема. Некоторые файлы JavaScript были вырезаны. Буфер настроек:

      uwsgi_buffers 1024 1024k;

uwsgi_buffer_size 1024k;

исправил проблему

Другие вопросы по тегам