Подтвердить что ты не робот

Соединение reset с помощью peer при использовании s3, boto, django-storage для статических файлов

Я пытаюсь переключиться на использование amazon s3 для размещения наших статических файлов для нашего проекта django. Я использую django, boto, django-storage и django-compressor. Когда я запускаю коллекцию static на моем dev-сервере, я получаю сообщение об ошибке

socket.error: [Errno 104] Connection reset by peer 

Размер всех моих статических файлов составляет 74 МБ, что не кажется слишком большим. Кто-нибудь видел это раньше или имеет какие-либо советы по отладке?

Вот полный след.

Traceback (most recent call last):
  File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 196, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 371, in handle
    return self.handle_noargs(**options)
  File "/usr/local/lib/python2.7/dist-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 163, in handle_noargs
    collected = self.collect()
  File "/usr/local/lib/python2.7/dist-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 113, in collect
    handler(path, prefixed_path, storage)
  File "/usr/local/lib/python2.7/dist-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 303, in copy_file
    self.storage.save(prefixed_path, source_file)
  File "/usr/local/lib/python2.7/dist-packages/django/core/files/storage.py", line 45, in save
    name = self._save(name, content)
  File "/usr/local/lib/python2.7/dist-packages/storages/backends/s3boto.py", line 392, in _save
    self._save_content(key, content, headers=headers)
  File "/usr/local/lib/python2.7/dist-packages/storages/backends/s3boto.py", line 403, in _save_content
    rewind=True, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/boto/s3/key.py", line 1222, in set_contents_from_file
    chunked_transfer=chunked_transfer, size=size)
  File "/usr/local/lib/python2.7/dist-packages/boto/s3/key.py", line 714, in send_file
    chunked_transfer=chunked_transfer, size=size)
  File "/usr/local/lib/python2.7/dist-packages/boto/s3/key.py", line 890, in _send_file_internal
    query_args=query_args
  File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 547, in make_request
    retry_handler=retry_handler
  File "/usr/local/lib/python2.7/dist-packages/boto/connection.py", line 966, in make_request
    retry_handler=retry_handler)
  File "/usr/local/lib/python2.7/dist-packages/boto/connection.py", line 927, in _mexe
    raise e
socket.error: [Errno 104] Connection reset by peer

ОБНОВЛЕНИЕ: у меня нет ответа на вопрос об отладке этой ошибки, но позже это просто прекратилось, что заставляет меня думать, что это может быть связано с чем-то на S3.

4b9b3361

Ответ 1

ТЛ; дг

Если ваше ведро не находится в области по умолчанию, вам нужно указать boto, к какой области подключиться, например. если ваше ведро находится в us-west-2, вам нужно добавить следующую строку в settings.py:

 AWS_S3_HOST = 's3-us-west-2.amazonaws.com'

Длительное объяснение:

Это не проблема разрешений, и вы не должны устанавливать права на ведро для "Аутентифицированных пользователей".

Эта проблема возникает, если вы создаете свой ведро в регионе, который не является стандартным (в моем случае я использовал us-west-2).

Если вы не используете область по умолчанию, и вы не укажете boto, в какой области находится ваш ведро, boto подключится к области по умолчанию, а S3 ответит перенаправлением 307 в область, где находится ведро.

К сожалению, из-за этой ошибки в boto:

https://github.com/boto/boto/issues/2207

если ответ 307 поступит до того, как boto закончит загрузку файла, boto не увидит перенаправление и продолжит загрузку в область по умолчанию. В конце концов S3 закрывает сокет, в результате получается "Connection reset by peer".

Это своего рода состояние гонки, которое зависит от размера загружаемого объекта и скорости вашего интернет-соединения, что объясняет, почему это происходит случайным образом.

Есть две возможные причины, по которым ОП перестает видеть ошибку через некоторое время:

- he later created a new bucket in the default region and the problem went away by itself. 
- he started uploading only small files, which are fast enough to be fully uploaded by the time S3 replies with 307

Ответ 2

Это проблема возникает, когда вы создаете новый ковш в первый раз, вам нужно подождать несколько часов или минут до начала загрузки. Я не знаю, почему s3 ведет себя так. Чтобы доказать, что попробуйте создать новый ковш, укажите на него хранилище django, и вы увидите, что он показывает соединение peer reset, когда вы пытаетесь загрузить какую-либо вещь из своего проекта django, но подождите пару часов или минут, попробуйте еще раз. Работа. Повторите тот же шаг и посмотрите.

Ответ 3

У меня просто возникла проблема с настройкой второго ведра S3 для тестирования/разработки и , что помогло развертывать более старую версию приложения.

Я не знаю, почему это поможет, но для тех, кто читает этот путь после факта (например, я, пару часов назад), стоит попробовать развернуть другую версию приложения.

Ответ 4

Вам необходимо установить ведро разрешений на Authenticated Users List + Upload/Delete, или вы можете создать определенного пользователя в разделе IAM amazon и настроить права доступа только для этого конкретного пользователя

Это помогло мне несколько раз назад: Настройка S3 для Django