NGINX与Django在非调试模式下部分静态文件不服务

0 投票
2 回答
49 浏览
提问于 2025-04-14 15:56

我在关闭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 个回答

0

这里有一些可能导致它不工作的原因。

  1. 确保你在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)

  2. 在HTML文件中添加 {% load 'static' %},并使用 <link rel="stylesheet" href="{% static 'fonts/icomoon/style.css' %}">

  3. 运行命令 python manage.py collectstatic,这样会把项目中的所有静态文件打包到 staticfiles 文件夹里,或者你想要的其他地方。

0

这可能有几个原因导致这个问题。

  1. 确保你在nginx的配置文件中包含了mime类型。
/etc/nginx/mime.types;
location /static {
   ...
}
  1. 有些人反映Whitenoise的 whitenoise.storage.CompressedManifestStaticFilesStorage 存储后端在某些情况下表现不佳。可以尝试把它改成 whitenoise.storage.CompressedStaticFilesStorage

撰写回答