nginx 不提供管理静态文件?

nginx 不提供管理静态文件?

澄清以下错误仅适用于管理静态文件即它特定于与 Django admin 对应的静态文件。其余静态文件运行正常。

问题

基本上,我无法访问管理静态文件使用 ngix 服务器。

它确实与 Django 的微服务器一起工作,并且collectstatic正在执行其工作,这意味着它将文件放在静态文件夹中的预期位置。

网址正确,但我无法访问管理静态文件直接,但其他的我可以。例如:

  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

我的建议:

  1. 使用 django 1.3+(和ADMIN_MEDIA_PREFIX 现已弃用

  2. 设置两者STATIC_URLSTATIC_ROOT在你的 settings.py 中

  3. 在您的 nginx conf 中仅定义一个静态条目(带有尾随斜杠)。不需要第二个是static/admin/

    location /static/  {
            alias /path/to/static/;
    }
    
  4. 使用collectstatic哪个应该收集 admin -> static/admin。它将与您收集的所有其他静态媒体位于同一位置。

    python manage.py collectstatic

答案2

我有同样的问题。我的 Centos 7.6 上的 nginx 服务器无法访问路径中的静态文件夹/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)

审计消息的副本 ID1558033633.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当您运行此命令时,您可以在此处看到答案,您会看到静态内容

相关内容