Nginx不提供Django管理静态文件

Nginx不提供Django管理静态文件,django,nginx,gunicorn,django-staticfiles,Django,Nginx,Gunicorn,Django Staticfiles,404 URL示例: http://ip.address/static/admin/css/base.css 我不确定我做错了什么。以下是相关文件: 设置.py STATICFILES_DIRS = [ '/home/username/sitename/sitenameenv/lib/python3.5/site-packages/django/contrib/admin/static', ] STATIC_URL = '/static/' STATIC_ROOT = '/home/user

404 URL示例:

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

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

设置.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\u ROOT
并使用
collectstatic
之前,它们也是这样做的,我认为这是不必要的。但是,我的管理员正在为其静态文件获取404。

更新:

运行
collectstatic
将在
STATIC\u ROOT
设置指定的目录中收集所有文件

因此,您需要将Nginx服务器配置为在
/satic/
url处为您的
静态根目录
文件夹提供服务:

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
,此请求被您的Nginx服务器截获,因为您已将
/static/
路径映射到此目录-
/home/username/sitename/website/static/

接下来,Nginx将尝试在
/home/username/sitename/website/static/
中查找
/admin/css/base.css
文件。但是那里没有任何
admin
目录,因此该请求最终成为
404


如何解决此问题?

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

# put this before `location /static/` conf

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

更新:

运行
collectstatic
将在
STATIC\u ROOT
设置指定的目录中收集所有文件

因此,您需要将Nginx服务器配置为在
/satic/
url处为您的
静态根目录
文件夹提供服务:

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
,此请求被您的Nginx服务器截获,因为您已将
/static/
路径映射到此目录-
/home/username/sitename/website/static/

接下来,Nginx将尝试在
/home/username/sitename/website/static/
中查找
/admin/css/base.css
文件。但是那里没有任何
admin
目录,因此该请求最终成为
404


如何解决此问题?

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

# put this before `location /static/` conf

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

我也有同样的问题。Centos 7.6上的My nginx服务器无法访问路径
/home/user/app/mysyte/static/
中的静态文件夹。在
/var/log/nginx/error.log中

open() "/home/user/app/mysyte/static/*.css" failed (13: Permission denied)
要解决和理解此问题,
:=*

  • 运行命令
    getenforce
  • 如果强制执行-
    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)
    
    审计消息的副本id
    1558033633.723:201

  • 运行命令
    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\u read\u user\u content 1
    当您运行此命令时,您会看到您的静态内容

    我也有同样的问题。Centos 7.6上的My nginx服务器无法访问路径
    /home/user/app/mysyte/static/
    中的静态文件夹。在
    /var/log/nginx/error.log中

    open() "/home/user/app/mysyte/static/*.css" failed (13: Permission denied)
    
    要解决和理解此问题,
    :=*

  • 运行命令
    getenforce
  • 如果强制执行-
    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)
    
    审计消息的副本id
    1558033633.723:201

  • 运行命令
    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\u read\u user\u content 1
    当您运行此命令时,您可以看到您的静态内容

    您可以发布
    404
    url吗?@xyres问题更新。您好,我已经用更好的解决方案更新了答案。请看一看。我很抱歉之前匆忙发布了一个垃圾答案。你能发布一个
    404
    url吗?@xyres问题更新。嗨,我已经用更好的解决方案更新了答案。请看一看。我很抱歉之前匆忙发布了一个垃圾答案。
    /static/admin/
    的位置在我的nginx配置中重要吗?在
    /static/
    之前?@smilebomb我不确定。我还没有测试过,所以不能说。这不是正确的解决方案。collectstatic的目的是在一个地方收集所有的静态文件。@DanielRoseman我考虑过这个问题,但我查看了Nginx conf,这种方式似乎很明显。但我想你是对的。我会更新答案。@DanielRoseman我已经更新了答案。感谢您的提示。在我的nginx配置中,
    /static/admin/
    的位置重要吗?在
    /static/
    之前?@smilebomb我不确定。我还没有测试过,所以不能说。这不是正确的解决方案。collectstatic的目的是在一个地方收集所有的静态文件。@DanielRoseman我考虑过这个问题,但我查看了Nginx conf,这种方式似乎很明显。但我想你是对的。我会更新答案。@DanielRoseman我已经更新了答案。谢谢你的提示。