nginx 不提供管理靜態文件?
澄清:以下錯誤僅針對admin靜態文件,即特定於Django admin對應的靜態文件。其餘的靜態文件執行良好。
問題
基本上,我無法使用 ngix 伺服器訪問管理靜態文件。
它確實與 Django 的微型伺服器一起工作,並且
collectstatic
正在完成它的工作,這意味著它將文件放在靜態文件夾中的預期位置。網址是正確的,但我無法直接訪問管理靜態文件,但其他我可以。因此,例如:
- 我可以訪問這個 url(在瀏覽器中複製它):
myserver.com:8080/static/css/base/base.css
- 但我無法訪問這個其他網址(在瀏覽器中複製它):
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/; }
我的建議:
- 使用 django 1.3+(現在不推薦使用 ADMIN_MEDIA_PREFIX )
- 在你的 settings.py 中設置
STATIC_URL
和STATIC_ROOT
- 在您的 nginx conf 中僅定義一個靜態條目(帶有斜杠)。不需要第二個地址
static/admin/
:location /static/ { alias /path/to/static/; }
- 使用
collectstatic
which 應該收集管理員 -> 靜態/管理員。它將與您收集的所有其他靜態媒體位於同一位置。
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)
為了解決和理解這個問題
:=*
- 執行命令
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_read_user_content 1
當您執行此命令時,您可以在此處看到答案,您會看到您的靜態內容