Назад | Перейти на главную страницу

nginx не обслуживает статические файлы администратора?

Разъяснение: Следующая ошибка предназначена только для статические файлы администратора, т.е. он специфичен для статических файлов, соответствующих администратору Django. Остальные статические файлы работают отлично.

Проблема

Обычно я не могу получить доступ к статические файлы администратора с помощью сервера ngix.

Он работает с микросервером Django, а collectstatic выполняет свою работу, то есть помещает файлы в ожидаемое место в статической папке.

URL-адреса верны, но я не могу получить доступ к статические файлы администратора прямо, а с остальными я могу. Так, например:

  1. Я могу получить доступ к этому URL (скопировав его в браузере): myserver.com:8080/static/css/base/base.css

  2. но я не могу получить доступ к этому другому URL-адресу (копируя его в браузере): myserver.com:8080/static/admin/css/admin.css


Что я пробовал?

Это работает если я скопирую admin/ структура каталогов в __other_admin_directory_name/__, а затем я получаю доступ myserver.com:8080/static/__other_admin_directory_name__/css/admin.css

Более того,

  1. Я проверил разрешения и все нормально.
  2. Я попытался изменить ADMIN_MEDIA_PREFIX = '/ static / admin /' на ADMIN_MEDIA_PREFIX = '/ static /other_admin_directory_name/ ', это не работает.

Наконец, это, кажется, важный ключ к разгадке:

Я пытался скопировать admin/ структура каталогов в __admin_and_then_any_suffix/__. Тогда я не могу получить доступ myserver.com:8080/static/__admin_and_then_any_suffix/__/css/admin.css. Итак, если имя каталога начинается с admin (например, администрация или admin2) затем это не работает.


РЕДАКТИРОВАТЬ - добавлено благодаря наблюдению @sarnold:

Проблема, похоже, в файле конфигурации nginx / etc / nginx / sites-available / mysite

location /static/admin {
   alias /home/vl3/.virtualenvs/vl3/lib/python2.7/site-packages/django/contrib/admin/media/;
}

Мои предложения:

  1. Используйте django 1.3+ (и ADMIN_MEDIA_PREFIX устарел)

  2. Установите оба STATIC_URL и STATIC_ROOT в вашем settings.py

  3. Определите только одну статическую запись в вашей конфигурации nginx (с завершающей косой чертой). Незачем для второго, который обращается static/admin/:

    location /static/  {
            alias /path/to/static/;
    }
    
  4. Использовать collectstatic который должен собирать admin -> static / admin. Он будет находиться в том же месте, что и все остальные собранные вами статические носители.

    python manage.py collectstatic

У меня та же проблема. Мой сервер nginx на Centos 7.6 не может получить доступ к статической папке в пути /home/user/app/mysyte/static/. В /var/log/nginx/error.log та же ошибка

open() "/home/user/app/mysyte/static/*.css" failed (13: Permission denied)

Для решения и понимания этой проблемы :=*

  1. Команда выполнения getenforce
  2. если принудительное исполнение - cat /var/log/audit/audit.log | grep nginx

для меня строка с ошибками выглядит как

type=AVC msg=audit(1558033633.723:201): avc:  denied  { read } for  pid=7758 comm="nginx" name="responsive.css" dev="dm-0" ino=17312394 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0
type=SYSCALL msg=audit(1558033633.723:201): arch=c000003e syscall=2 success=no exit=-13 a0=564f710dd55d a1=800 a2=0 a3=68632f656d6f682f items=0 ppid=7757 pid=7758 auid=4294967295 uid=998 gid=996 euid=998 suid=998 fsuid=998 egid=996 sgid=996 fsgid=996 tty=(none) ses=4294967295 comm="nginx" exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0 key=(null)

Копировать идентификатор сообщения аудита 1558033633.723:201

  1. Команда выполнения grep yours_audit_id /var/log/audit/audit.log | audit2why

вывод для меня

[root@uwsgi ~]# grep 1558034479.384:221 /var/log/audit/audit.log | audit2why
type=AVC msg=audit(1558034479.384:221): avc:  denied  { read } for  pid=7758 comm="nginx" name="responsive.css" dev="dm-0" ino=17312394 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0

        Was caused by:
        The boolean httpd_read_user_content was set incorrectly.
        Description:
        Allow httpd to read user content

        Allow access by executing:
        # setsebool -P httpd_read_user_content 1

Итак, как вы можете видеть ответ здесь setsebool -P httpd_read_user_content 1 когда вы запускаете эту команду, вы видите свой статический контент