Django

nginx 不提供管理靜態文件?

  • May 16, 2019

澄清以下錯誤僅針對admin靜態文件,即特定於Django admin對應的靜態文件。其餘的靜態文件執行良好。

問題

基本上,我無法使用 ngix 伺服器訪問管理靜態文件。

它確實與 Django 的微型伺服器一起工作,並且collectstatic正在完成它的工作,這意味著它將文件放在靜態文件夾中的預期位置。

網址是正確的,但我無法直接訪問管理靜態文件,但其他我可以。因此,例如:

  1. 我可以訪問這個 url(在瀏覽器中複製它): myserver.com:8080/static/css/base/base.css
  2. 但我無法訪問這個其他網址(在瀏覽器中複製它): 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. 使用 django 1.3+(現在不推薦使用 ADMIN_MEDIA_PREFIX )
  2. 在你的 settings.py 中設置STATIC_URLSTATIC_ROOT
  3. 在您的 nginx conf 中僅定義一個靜態條目(帶有斜杠)。不需要第二個地址static/admin/
location /static/  {
       alias /path/to/static/;
}
  1. 使用collectstaticwhich 應該收集管理員 -> 靜態/管理員。它將與您收集的所有其他靜態媒體位於同一位置。

python manage.py collectstatic

我也有同樣的問題。我在 Centos 7.6 上的 nginx 伺服器無法訪問 path 中的靜態文件夾/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當您執行此命令時,您可以在此處看到答案,您會看到您的靜態內容

引用自:https://serverfault.com/questions/403264