23

django プロジェクトの静的ファイルをホストするために Amazon s3 を使用するように切り替えようとしています。私はdjango、boto、django-storage、およびdjango-compressorを使用しています。開発サーバーで collect static を実行すると、エラーが発生します

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

すべての静的ファイルのサイズは 74MB で、大きすぎるようには見えません。誰かがこれを以前に見たことがありますか、またはデバッグのヒントはありますか?

これが完全なトレースです。

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 で何かに関係している可能性があると思われます。

4

4 に答える 4

17

tl;dr

バケットがデフォルト リージョンにない場合は、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

boto がファイルのアップロードを完了する前に 307 応答が届いた場合、boto はリダイレクトを認識せず、デフォルト リージョンへのアップロードを続行します。最終的に S3 はソケットを閉じ、「ピアによる接続のリセット」が発生します。

これは、アップロードされるオブジェクトのサイズとインターネット接続の速度に依存する一種の競合状態であり、ランダムに発生する理由を説明しています.

しばらくして OP でエラーが表示されなくなった理由として、次の 2 つが考えられます。

- 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
于 2016-08-18T13:46:58.623 に答える
5

これは、新しいバケットを初めて作成するときに発生する場合がある問題で、アップロードを開始する前に数時間または数分待つ必要があります。なぜs3がそのように振る舞うのかわかりません。新しいバケットを作成しようとすることを証明するには、django ストレージをそれに向けると、django プロジェクトから何かをアップロードしようとすると接続ピアのリセットが表示されますが、数時間または数分待ってから再試行してください。同じ手順を繰り返して見てください。

于 2016-09-22T07:19:31.137 に答える
-1

バケットのアクセス許可をに設定する必要がありますAuthenticated Usersリスト + アップロード/削除または、Amazon の IAM セクションで特定のユーザーを作成し、その特定のユーザーのみにアクセス権を設定できます。

これは数回前に私を助けました:Django用のS3のセットアップ

于 2015-01-21T11:31:31.163 に答える