Nginx没有提供Django管理静态文件

时间:2018-03-16 20:50:39

标签: django nginx gunicorn django-staticfiles

示例404网址:

http://ip.address/static/admin/css/base.css

我不确定我做错了什么。这是相关文件:

settings.py

STATICFILES_DIRS = [
  '/home/username/sitename/sitenameenv/lib/python3.5/site-packages/django/contrib/admin/static',
]
STATIC_URL = '/static/'
STATIC_ROOT = '/home/username/sitename/website/staticroot/'

Nginx配置:

server {
    listen 80;
    server_name http://ip.address/;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/username/sitename/website/;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/username/sitename/sitename.sock;
    }
}

常规静态文件正在正确提供,他们也在我添加STATIC_ROOT并使用collectstatic之前这样做了,我认为这是不必要的。我的管理员虽然为其静态文件获得了404s。

2 个答案:

答案 0 :(得分:0)

<强>更新

正在运行collectstatic将收集STATIC_ROOT设置指定的目录中的所有文件。

因此,您需要将Nginx服务器配置为在STATIC_ROOT网址上提供/satic/文件夹:

location /static/ {
    # using `alias` instead of `root`
    # vvv
    alias   /home/username/sitename/website/staticroot/;
            #                                  ^^^
            # the full path to the STATIC_ROOT directory
}

旧版本(不太有用):

为什么会这样?

这是一个需要注意的重要事项:Django不提供静态文件。我相信你知道的。

因此,当您的浏览器从 - http://ip.address/static/admin/css/base.css请求admin css文件时,您的Nginx服务器会拦截此请求,因为您已将/static/路径映射到此目录 - /home/username/sitename/website/static/

现在,接下来会发生什么,Nginx将尝试在/admin/css/base.css内找到/home/username/sitename/website/static/文件。但是那里没有任何admin目录,因此该请求最终为404

如何解决此问题?

您可以将/static/admin/网址映射到admin目录实际所在的目录。例如:

# put this before `location /static/` conf

location /static/admin/ {
    root   /home/username/sitename/sitenameenv/lib/python3.5/site-packages/django/contrib/admin/;
}

答案 1 :(得分:0)

我有同样的问题。我在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)

审核消息1558033633.723:201的副本ID

  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看到答案,因此您会看到静态内容