我正在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"
这里有什么我错过的吗?
答案 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界面。看看这里: