将Django部署到AWS;假人的静态文件

时间:2018-12-13 21:16:46

标签: django amazon-web-services django-staticfiles static-files

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

到目前为止,我已经能够开发一个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错误(而它们过去仅对文件返回错误)。因此,这是我的文件夹结构,下面是我的设置文件的相关部分(该文件实际上分为基础,开发和生产)。

[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'

我已确保要在生产需求文件中导入白噪声。

我想念什么?

此外,我从未使用过AWS支持系统。 (我是免费会员。)这是我可以得到他们帮助的事情吗?我要开始案件吗?

TIA。

1 个答案:

答案 0 :(得分:2)

首先您的问题:

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

我写了blog post about this

此设置适用于一个EC2实例:

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

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

  • 存储在由所有EC2实例安装和共享的EFS卷上的静态文件(比起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目录中,白噪声将在其中获取它们以提供服务。每次文件更改时,您都会看到MD5哈希添加到文件名中,这是为了使浏览器能够获取新版本并且不使用缓存版本(Whitenoise告诉浏览器默认将静态文件缓存2年)。

如果您可以使用它,请开始添加CDN(对其进行设置,以便从服务器中获取文件,whitenoise现在只需将每个文件提供给CDN一次,浏览器将从CDN中获取它);您需要更改STATIC_URL来添加CDN的主机名(例如https://die9493v4034.cloudfront.net/static/)。

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