我正在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"
我在这里错过了什么吗?
这不容易捕捉到.但是,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:
更深入的是,在wsgi.conf文件中:
Alias /static/ /opt/python/current/app/static/Order allow,deny Allow from all
这意味着对/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将提供静态文件,而不是apache.
旁注
遗憾的是,AWS EB Python环境不允许您删除/ static/Alias,既不使用eb命令行工具,也不使用Web界面.看看这里: