Nginx UWSGI ответы усечены
Я попытался написать веб-сервис в шутку сегодня на http://dont-tread-on-memes.controversial.io/. Это колба приложение, которое обслуживает довольно большие изображения. Приложение Flask хорошо работает само по себе, как и независимый сервер uWSGI, но когда я пытаюсь подключить uWSGI к NGINX через uwsgi_pass
Внезапно каждый второй запрос усекается на 9,99 КБ во всех браузерах.
После прочтения о подобном усечении с proxy_pass
Я старался:
- настройка
uwsgi_buffering
вoff
в моем конфигурационном файле - Увеличение размера буфера до
1024k
сuwsgi_buffers 1024 1024k; uwsgi_buffer_size 1024k;
sendfile: off
- Проверка прав доступа к файлу буфера (все файлы в
/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;
исправил проблему