【问题标题】:Nginx not serving up Django admin static filesNginx 不提供 Django 管理静态文件
【发布时间】:2018-08-26 00:38:19
【问题描述】:

404 URL 示例:

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 之前它们也这样做了,我认为这是不必要的。不过,我的管理员正在为其静态文件获取 404。

【问题讨论】:

  • 你能发一个404的网址吗?
  • @xyres 问题已更新。
  • 嗨,我已经用更好的解决方案更新了答案。请看一下。我很抱歉之前匆忙发布了一个垃圾答案。

标签: django nginx gunicorn django-staticfiles


【解决方案1】:

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

审计信息的复制ID 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,当你运行这个命令时,你会看到你的静态内容

【讨论】:

    【解决方案2】:

    更新:

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

    因此,您需要配置 Nginx 服务器以在 /satic/ url 处为您的 STATIC_ROOT 文件夹提供服务:

    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 请求管理 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/;
    }
    

    【讨论】:

    • /static/admin/ 的位置在我的 nginx 配置中是否重要?在/static/之前?
    • @smilebomb 我不确定。我没有测试过,所以不能说。
    • 这不是正确的解决方案。 collectstatic的重点是将所有的静态文件收集到一个地方。
    • @DanielRoseman 我想过,但我查看了 Nginx conf,这种方式似乎很明显。但我想你是对的。我会更新答案。
    • @DanielRoseman 我已经更新了答案。感谢您的提示。
    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 2021-12-02
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2012-03-19
    • 2016-01-28
    相关资源
    最近更新 更多