我正在尝试切换到使用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上的某些内容有关。
答案 0 :(得分:14)
TL;博士
如果您的存储桶不在默认区域,您需要告诉boto要连接的区域,例如如果您的存储桶位于us-west-2,则需要将以下行添加到settings.py:
AWS_S3_HOST = 's3-us-west-2.amazonaws.com'
冗长的解释:
这不是权限问题,您不应将存储桶权限设置为“经过身份验证的用户”。
如果您在非默认区域中创建存储桶,则会出现此问题(在我的情况下,我使用的是us-west-2)。
如果您不使用默认区域,并且未告知boto您的存储区所在的区域,则boto将连接到默认区域,S3将使用307重定向回复到存储区所属的区域。< / p>
不幸的是,由于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
答案 1 :(得分:4)
这是第一次创建新存储桶时出现问题,在开始上传之前必须等待几个小时或几分钟。我不知道s3为什么会这样。为了证明尝试创建一个新的存储桶,将django存储指向它,当你尝试从django项目上传任何东西时,你会看到它显示连接对等重置,但等待几个小时或分钟再次尝试它将起作用。重复相同的步骤,看看。
答案 2 :(得分:0)
我刚刚尝试设置第二个用于测试/开发的S3存储桶,以及部署旧版本应用程序的帮助。
我不知道为什么这会有所帮助,但是对于那些在事后读取这种方式的人(比如我,几个小时前),值得尝试部署不同的应用程序版本。
答案 3 :(得分:-1)
您必须将存储区权限设置为 ,或者您可以在亚马逊的IAM部分创建特定用户并设置仅针对该特定用户的访问权限Authenticated Users
列表+上传/删除
这对我来说很有帮助:Setup S3 for Django