为什么在AWS EB Python部署中不使用django进行whitenoise工作?

时间:2016-01-08 03:47:19

标签: django amazon-web-services elastic-beanstalk

我正在AWS Elastic Beanstalk上部署python应用程序,并使用DjangoWhiteNoise包装器包装wsgi应用程序。但是,我对静态文件的请求得到了404。

# wsgi.py
...
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)

# settings.py
...
STATIC_URL = '/static/'
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
STATIC_ROOT = os.path.abspath(os.path.join(BASE_DIR, '..', '.staticfiles'))

# .ebextensions/01_django.config
option_settings:
  "aws:elasticbeanstalk:application:environment":
    DJANGO_SETTINGS_MODULE: "myproject.settings.aws_ebs"
    PYTHONPATH: "/opt/python/current/app:$PYTHONPATH"
  "aws:elasticbeanstalk:container:python":
    WSGIPath: "myproject/wsgi.py"
container_commands:
  01_migrate:
    command: "django-admin.py migrate --noinput"
    leader_only: true
  02_collectstatic:
    command: "django-admin.py collectstatic --noinput"

这里有什么我错过的吗?

1 个答案:

答案 0 :(得分:6)

这不容易捕捉到。但是,apache正在为wsgi应用程序提供服务,如果你在/ etc / httpd中使用grep,你会看到一些怀疑的东西。

[ec2-user@ip-1-1-1-1 ~]$ cd /etc/httpd/
[ec2-user@ip-1-1-1-1 httpd]$ find . -type f -exec grep static {} +
./conf.d/wsgi.conf:Alias /static/ /opt/python/current/app/static/
./conf.d/wsgi.conf:<Directory /opt/python/current/app/static/>

更深入,在wsgi.conf文件中:

Alias /static/ /opt/python/current/app/static/
<Directory /opt/python/current/app/static/>
Order allow,deny
Allow from all
</Directory>

这意味着对/static/some/resource.css的请求永远不会到达wsgi应用程序,并且/ opt / python / current / app / static /中的文件不存在,因此它将返回404。

有几个选项可以解决这个问题:)

<强> 1。跳过WhiteNoise并通过apache提供文件。

删除wsgi.py中的最后两行,以便您只使用django wsgi应用程序。同时更改以下内容:

# settings.py - set the storage to use djangos built in ManifestStaticFilesStorage
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

# .ebextensions/01_django.conf - add this to option_settings section
  "aws:elasticbeanstalk:container:python:staticfiles":
    "/static/": ".staticfiles/"

此解决方案的缺点是文件不会被压缩。但是,无论如何,您可能会使用某种CDN作为静态文件,然后压缩文件就不会有任何问题。 AWS CloudFront是可用于启用静态文件压缩的​​CDN示例。

<强> 2。设置STATIC_URL ='/ staticfiles /'

将STATIC_URL更改为'/ static /'的其他内容,例如'/ staticfiles /',这样就不会与'/ static /'别名匹配,而django将提供静态文件,而不是阿帕奇。

附注

不幸的是,AWS EB Python环境不允许您删除/ static / Alias,既不使用 eb 命令行工具,也不使用Web界面。看看这里:

AWS Web Console AWS Elastic Beanstalk Python configurations