Проблема с загрузкой файлов на S3 в Django на Azure App Services
Наше приложение уже несколько лет размещается на Heroku без каких-либо проблем с загрузкой на S3. Сейчас мы работаем над переходом на Azure App Services. Сейчас мы столкнулись с проблемой, когда загрузка файлов не удается. Кажется, что они прерываются по времени и приводят к прерыванию и закрытию рабочего gunicorn. Журнал сервера и трассировка стека не помогли, но я надеюсь, что кто-то еще может увидеть здесь что-то полезное. Ни одна из конфигураций или настроек хранилища не была изменена с Heroku на Azure.
Используемые пакеты:
Django==3.2.25
boto3==1.35.9
botocore==1.35.9
s3transfer==0.10.2
django-storages==1.14.4
Настройки:
DEFAULT_FILE_STORAGE = 'project.utils.storage.HashedFilenameMediaS3Boto3Storage'
Класс хранения - эта настройка класса хранения была реализована около 8 лет назад, так что, возможно, мне нужно внести некоторые изменения?:
Я включил вывод отладки бото, используя:
import boto3
boto3.set_stream_logger('')
При попытке загрузить файл в S3 отладочный вывод boto выглядит следующим образом:
А это фактический стек-трейс, который возникает, когда рабочий gunicorn завершает работу:
Traceback (most recent call last):
File "/usr/local/lib/python3.12/site-packages/s3transfer/tasks.py", line 269, in _main
self._submit(transfer_future=transfer_future, **kwargs)
File "/usr/local/lib/python3.12/site-packages/s3transfer/upload.py", line 597, in _submit
self._submit_upload_request(
File "/usr/local/lib/python3.12/site-packages/s3transfer/upload.py", line 632, in _submit_upload_request
self._transfer_coordinator.submit(
File "/usr/local/lib/python3.12/site-packages/s3transfer/futures.py", line 323, in submit
future = executor.submit(task, tag=tag)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/s3transfer/futures.py", line 474, in submit
future = ExecutorFuture(self._executor.submit(task))
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/concurrent/futures/thread.py", line 165, in submit
with self._shutdown_lock, _global_shutdown_lock:
File "/usr/local/lib/python3.12/site-packages/gunicorn/workers/base.py", line 204, in handle_abort
sys.exit(1)
SystemExit: 1
Любые предложения будут высоко оценены.
Наконец-то выяснилось, что это не связано с azure, а связано с docker и gunicorn.
По какой-то причине использование рабочего типа gevent в контейнере docker приводит к тому, что загрузка данных в S3 не выполняется, а сам рабочий завершает работу и выходит из системы.
Переход на рабочий тип gthread решает проблему.
Провалы:
gunicorn project.config.wsgi:application --bind 0.0.0.0:8000 --timeout 120 --preload --access-logfile '-' --error-logfile '-' --worker-class gevent --log-level 'debug'
Успешно:
gunicorn project.config.wsgi:application --bind 0.0.0.0:8000 --timeout 120 --preload --access-logfile '-' --error-logfile '-' --worker-class gthread --log-level 'debug' --workers 8 --threads 8 --worker-connections 1000 --keep-alive 2