【问题标题】:Connection reset by peer when using s3, boto, django-storage for static files对静态文件使用 s3、boto、django-storage 时由对等方重置连接
【发布时间】:2013-12-24 13:26:43
【问题描述】:

我正在尝试切换到使用 amazon s3 来托管我们的 django 项目的静态文件。我正在使用 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 上的某些东西有关。

【问题讨论】:

  • 我现在遇到了同样的问题。还有什么其他的吗?
  • github.com/jschneier/django-storages-redux 有一个维护的 django-storages 分支,如果您再次遇到这种情况,可能值得一试。
  • 我遇到了同样的问题:/它在部署期间设法将一些文件复制到静态存储桶,然后每次都在同一个位置出现此错误
  • 未设置 AWS_ACCESS_KEY_ID 或 AWS_SECRET_ACCESS_KEY 时会出现此错误。

标签: django amazon-s3 static-files django-storage


【解决方案1】:

tl;博士

如果您的存储桶不在默认区域中,您需要告诉 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 关闭套接字,从而导致“对等方重置连接”。

这是一种竞争条件,取决于上传对象的大小和您的互联网连接速度,这就解释了为什么它会随机发生。

一段时间后 OP 停止看到错误有两个可能的原因:

- 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 存储指向它,当您尝试从 django 项目上传任何内容时,您将看到它显示连接对等重置,但等待几个小时或几分钟再试一次它会起作用。重复同样的步骤,看看。

    【讨论】:

      【解决方案3】:

      我在尝试设置第二个 S3 存储桶用于测试/开发时遇到了这个问题,帮助部署旧版本的应用程序

      我不知道为什么这样做会有所帮助,但对于那些事后以这种方式阅读的人(像我一样,几个小时前),值得尝试部署不同的应用程序版本。

      【讨论】:

        【解决方案4】:

        您必须将 bucket 权限 设置为 Authenticated Users List + Upload/Delete 或者您可以在 amazon 的 IAM 部分创建特定用户并设置访问权限仅适用于该特定用户

        这曾经帮助过我:Setup S3 for Django

        【讨论】:

        • 实际上,我认为您不应该使用 Authenticated Users 列表 - 这使得任何拥有 Amazon S3 帐户的人都可以使用它,而不仅仅是您帐户中的用户。 (bucketexplorer.com/documentation/…)
        • @seddonym 没错。感谢您指出。我不知道。我删除了那部分答案。
        • boto3 因权限不足引发不同的异常。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-05
        • 2019-01-08
        • 1970-01-01
        相关资源
        最近更新 更多