将Django部署到AWS;傻瓜的静态文件

问题描述 投票:0回答:1

我完全迷失在这个项目的最后一步。

到目前为止,我已经能够开发一个django应用程序,它按照我想要的方式在localhost上运行;我已经能够将网站部署到AWS EC2,但我必须遗漏一些关于提供静态文件的基本知识。 (我还没有尝试过媒体文件。)我已经阅读了Django Deployment page和How-To管理static files,但我之前从未部署过网站。我发现的教程似乎是矛盾的(或过时的?)。

以下是我认为我现在的问题:

  1. 我是否需要在存储桶中托管静态(和/或媒体)文件,或者这仅仅是一个好主意?
  2. 当我设置STATIC_ROOT和STATIC_URL时,我应该设置STATICFILE_DIRS吗? (我的意思是,我认为我真的需要一个关于它们如何组合在一起的教程,它们的设置以及模板中“静态”的工作方式。)
  3. 我试图让白痴走了;我收到一条消息,说STATIC_URL设置不正确;我找不到文档告诉我它应该是什么。这是一个可行的根源吗?

编辑

即使使用@DirkGroten非常详细的答案,我仍然没有得到如何提供静态文件。我可以运行服务器,然后运行Web浏览器以查看没有静态文件的页面。但是,我现在有一个新问题:在它们上面有静态文件的页面返回500 27错误(而它们用于仅返回文件的错误)。所以,这是我的文件夹结构,下面是我的设置文件的相关部分(实际上分为base,dev和prod)。

[mainsite]/
|---[mainsite]/
|   |---[settings]/
|       |---base.py
|       |---dev.py
|       |---prod.py
|---[app1]/
|   |---[migrations]
|   |---[static]/
|   |   |---[app1]/
|   |   |   |---app1_file1.jpg (etc)
|   |   |---app1_style.css
|   |---[templates]/
|   |   |---[app1]/
|   |       |---about.html (etc)
|---[app2]/ (etc)
|---[static]  (this gets populated after running collectstatic)

开发设置:

Debug = False
ALLOWED_HOSTS = [###.###.###.###]  

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',   
... (the rest of the middleware)
]

STATIC_URL = '/static/'
STATIC_ROOT = os.path.abspath(os.path.join(BASE_DIR, 'static'))
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'app1/'),
                    os.path.join(BASE_DIR, 'app2/'),
                    os.path.join(BASE_DIR, 'app3/'),
                    ]
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

我确保我在生产要求文件中导入whitnoise。

我错过了什么?

此外,我从未使用AWS支持系统。 (我在免费等级。)这是我能得到他们帮助的事情吗?我开个案了吗?

TIA。

django amazon-web-services django-staticfiles static-files
1个回答
2
投票

首先你的问题:

  1. 不,这是其中一个选项,但是当您需要从多个EC2实例为您的站点提供服务时,使用集中式共享存储绝对是个好主意。 S3是一个选项,我使用EFS,我觉得更容易(见下文)。
  2. 是的,你需要告诉collectstatic在哪里找到静态文件,所以你应该有STATICFILES_DIRS
  3. 是的,我喜欢whitenoise,它与CDN结合使用效果很好。使您更容易不担心到期/缓存标头。

我写了一个blog post about this

这是一个适用于一个EC2实例的设置:

  • 本地存储在EC2实例上的静态文件(在EBS卷上) - > STATIC_ROOT设置(它们存储在何处)
  • Whitenoise正确地提供静态文件和设置缓存头
  • CompressedManifestStaticFilesStorage作为存储(STATICFILES_STORAGE设置)
  • 最好是CloudFront或其他CDN来提供静态文件 - > STATIC_URL设置。

最终,您需要集中存储静态文件,以便多个EC2实例可以访问它们(否则您必须在每台计算机上复制它们并确保清单文件同步),因此我自己的设置是:

  • 存储在EFS卷上的静态文件,由所有EC2实例安装和共享(比S3更容易设置和使用,因为就python而言,它只是一个挂载的磁盘)。我将EFS卷的安装点设置为与STATIC_ROOT相同的位置,因此设置中无需更改。
  • 然后与上面相同:Whitenoise,CloudFront和清单存储。

首先尝试使用第一个设置,执行以下操作:

  • STATIC_URL应该是将在HTML中显示的URL。只有/static/应该与WhiteNoiseMiddleware一起使用,但如果您使用CDN,则需要在其前面加上CDN实例的完整主机名。
  • STATICFILES_STORAGE应该是Whitenoise提供的存储之一,我推荐CompressedManifestStaticFilesStorage
  • STATICFILES_DIRS告诉collectstatic它可以找到要收集的静态文件。请注意,如果您在每个应用程序内的/static目录中只有静态文件,collectstatic会自动找到它们,您不应在此处指定这些目录。如果主项目目录中有/static目录,则应将(os.path.join(BASE_DIR, "my_site", "static"),)添加到STATICFILES_DIRS,其中BASE_DIR(或某些项目中的PROJECT_ROOT)是项目的根目录。
  • STATIC_ROOT应该是磁盘上静态文件的物理位置。这是collectstatic将复制它们并将它们编入索引的地方,从你的BASE_DIR开始,即os.path.abspath(os.path.join(BASE_DIR, '../static'))

现在每次更新代码和静态文件时,都应该运行django-admin collectstatic。这会将所有静态文件复制到STATIC_ROOT目录,在该目录中,whitenoise将获取它们以便为它们提供服务。每次文件更改时,您都会看到MD5哈希添加到文件名中,这样浏览器就会获取新版本并且不使用缓存版本(Whitenoise告诉浏览器默认情况下缓存静态文件2年)。

如果你让它工作,开始添加CDN(设置它以便从你的服务器获取文件,现在只需将每个文件服务一次到CDN,浏览器将从CDN获取它);你需要改变STATIC_URL来添加CDN的主机名(例如https://die9493v4034.cloudfront.net/static/)。

然后将文件的位置从本地实例移动到共享存储(例如EFS)。

© www.soinside.com 2019 - 2024. All rights reserved.