NGINX与Django在非调试模式下部分静态文件不服务
我在关闭Django的DEBUG模式后,发现了一些奇怪的情况,服务器是通过NGINX反向代理来运行的。
我是在一个运行Armbian Linux的机器上测试,使用的是Python 3.7.3。
我的Django项目中有一个manage.py文件,放在一个文件夹里。
文件夹的结构如下:
- /var/webserver/backend
- manage.py
- backend
- settings.py
- static
- img (contains collected plus my logo and favicon)
- admin (the collected admin files)
NGINX的配置如下(这是静态部分,其他部分是反向代理,并使用了自签名证书):
location /static {
autoindex on;
autoindex_exact_size off;
alias /var/webserver/backend/static;
}
settings.py中的静态文件部分如下,staticfiles应用在APPS里:
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'static'
我在/var/webserver/backend目录下运行manage.py命令,nginx作为服务在运行。
我觉得我已经尝试了NGINX配置和settings.py中所有可能的“斜杠”组合(在前面、后面、都有、都没有)。
这个配置是最接近能工作的,情况如下:
- static/img文件夹里的logo.png和favicon.ico显示正常。
- 所有的css、js文件等都没有加载(页面完全没有样式)。
- 日志中没有404错误(Django和NGINX的access.log都显示200)。
- 如果我在页面检查器中查看路径(比如在头部看到的
<link rel="stylesheet" type="text/css" href="/static/admin/css/base.css">
),我可以通过访问https://address/static/admin/css/base.css看到这个文件。 - 我尝试更改文件的权限和所有者,设置为777权限,所有者为root:www-data。
- 我尝试安装WhiteNoise,但没有成功。
我在浏览器中关闭了缓存,以避免加载旧页面。
我真的搞不懂哪里出了问题。
我尝试了各种方式更改配置,安装WhiteNoise并放入Apps中,但都没有成功。我还尝试在NGINX配置中把“alias”改成“root”,结果更糟(连图片也不显示了)。
感谢任何能提供帮助的人,如果需要其他信息,请告诉我。
2 个回答
这里有一些可能导致它不工作的原因。
确保你在urls.py文件中添加了MEDIA_ROOT。
urlpatterns = [path('', include('app_one.urls')),] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
如果 settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
在HTML文件中添加
{% load 'static' %}
,并使用<link rel="stylesheet" href="{% static 'fonts/icomoon/style.css' %}">
运行命令 python
manage.py collectstatic
,这样会把项目中的所有静态文件打包到 staticfiles 文件夹里,或者你想要的其他地方。
这可能有几个原因导致这个问题。
- 确保你在nginx的配置文件中包含了mime类型。
/etc/nginx/mime.types;
location /static {
...
}
- 有些人反映Whitenoise的
whitenoise.storage.CompressedManifestStaticFilesStorage
存储后端在某些情况下表现不佳。可以尝试把它改成whitenoise.storage.CompressedStaticFilesStorage
。