澄清:以下错误仅适用于管理静态文件即它特定于与 Django admin 对应的静态文件。其余静态文件运行正常。
问题
基本上,我无法访问管理静态文件使用 ngix 服务器。
它确实与 Django 的微服务器一起工作,并且collectstatic
正在执行其工作,这意味着它将文件放在静态文件夹中的预期位置。
网址正确,但我无法访问管理静态文件直接,但其他的我可以。例如:
我可以访问此 URL(在浏览器中复制它):
myserver.com:8080/static/css/base/base.css
但我无法访问这个其他 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
而且,
- 我检查了权限并且一切正常。
- 我尝试将 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 现已弃用)
设置两者
STATIC_URL
和STATIC_ROOT
在你的 settings.py 中在您的 nginx conf 中仅定义一个静态条目(带有尾随斜杠)。不需要第二个是
static/admin/
:location /static/ { alias /path/to/static/; }
使用
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)
为了解决和理解这个问题:=*
- 运行命令
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)
审计消息的副本 ID1558033633.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_read_user_content 1
当您运行此命令时,您可以在此处看到答案,您会看到静态内容