NGINX и Django не работают в режиме отладки, обслуживая некоторые статические файлы и некоторые нет
У меня наблюдается странное поведение после отключения DEBUG на Django, расположенном за NGINX reverse proxy.
Я тестирую его на 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'
Я запускаю команду manage.py, в то время как в каталоге /var/webserver/backend nginx запущен как служба.
Кажется, я перепробовал все комбинации "слэшей" как внутри конфигурации NGINX, так и в settings.py (до, после, оба, ни одного)
Эта конфигурация является ближайшей к работе, ситуация следующая:
- Логотип.png и favicon.ico в папке static/img отображаются правильно
- Все css, js или другие не загружены (страница полностью лишена стилей)
- В логах нет 404 (либо Django, либо NGINX access.log показывает 200).
- Если я перехожу по путям, которые я вижу в инспекторе страниц (например,
<link rel="stylesheet" type="text/css" href="/static/admin/css/base.css">
в разделе head), я могу увидеть файл (например, перейдя по адресу https://address/static/admin/css/base.css) .
- Я попробовал изменить права доступа и владельца файлов, перейдя на права 777 и root:www-data в качестве владельца .
- Я попробовал установить WhiteNoise, но безуспешно.
Я отключил кэш в браузере, чтобы избежать неперезагруженных страниц.
Я действительно не могу понять, что не работает.
Я пытался изменить конфигурацию любым способом, я пытался установить WhiteNoise и поместить его в Apps без успеха. Я попробовал заменить "alias" на "root" в конфигурации NGINX, и все стало еще хуже (также упали изображения)
Спасибо всем, кто поможет, дайте мне знать, если нужно что-то еще.
Может быть несколько причин, почему это происходит.
- Директива псевдонимовnginx должна заканчиваться слэшем (/) [ссылка
(https://nginx.org/en/docs/http/ngx_http_core_module.html#alias)
После
static
также следует добавить косую черту.
location /static/ {
...
alias /var/webserver/backend/static/;
}
Убедитесь, что вы включили типы mime в файл nginx conf.
Некоторые люди сообщают, что бэкенд хранилища Whitenoise
whitenoise.storage.CompressedManifestStaticFilesStorage
в некоторых случаях работает не очень хорошо. Попробуйте изменить его наwhitenoise.storage.CompressedStaticFilesStorage
.
Причины, по которым он не работает.
обязательно добавьте MEDIA_ROOT в urls.py
urlpatterns = [path('', include('app_one.urls')),] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
добавьте
{% load 'static' %}
с<link rel="stylesheet" href="{% static 'fonts/icomoon/style.css' %}">
в html-файлЗапустите python
manage.py collectstatic
. Затем он соберет все статические файлы в папку staticfiles проекта ИЛИ корневую папку static_files, в зависимости от того, где вы хотите их разместить.