超詳細的django1.8處理centos下nginx上處理靜態檔案步驟!

超詳細的django1.8處理centos下nginx上處理靜態檔案步驟!

這個坑擺弄了一天!

首先看我的專案目錄:

1.static檔案整個目錄有兩個,一個在專案根目錄下標記為1的,另一個是在專案app下標記為2的。需要注意的是2處的檔名必須為static,django會根據static檔名去查詢,之所以在static下又加入了wechat檔案,是為了防止以後專案裡有多個app時候static太多分不清所以設定的名稱空間,為什麼會分兩個static呢下面解釋。

2.首先如果你是DEBUG環境下,那麼專案settings.py下degub設定為True,這樣的話django1.8是會自己去找靜態檔案,不需要你改動任何操作,貌似低版本需要在urls里加入處理靜態檔案的server,總之我除錯的1.8版本在debug模式下不需要任何操作就可以載入到靜態檔案。

DEBUG = True

3.那麼令人頭疼的問題來了,在開發伺服器下,靜態檔案是載入不到的,一直顯示是404找不到檔案,我的html里載入靜態檔案的程式碼是這樣的:

{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="{% static 'wechat/css/style.css' %}" />
<script src="{% static 'wechat/js/home.js' %}"></script>
<title></title>
</head>
<body>
<p class="test">this is first Django Page</p>
</body>
</html>

4.首先我的app下是有靜態檔案的,也就是第一章圖示記為2的地方,我html裡引用的也是2處的靜態檔案,另外django自帶的admin後臺管理也會載入自己的靜態檔案,如果放在開發伺服器上admin的靜態檔案也是找不到的,如果你不用admin後臺管理,可以忽略我剛說的這些,為了開發遷移到開發伺服器方便,你需要在settings裡設定STATIC_ROOT讓所有散亂在專案的靜態檔案都集中到一起直接遷移到開發伺服器上,django會自動根據你html裡引用的去找靜態檔案,也就是說你什麼都不用做,django幫你完成,我是這樣理解的,雖然你引用的是2處的靜態檔案,但是在開發伺服器上會去1處找對應的檔案,現在在settings裡設定一下:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_URL = '/static/'
STATIC_ROOT =  os.path.join(BASE_DIR,'static')

5.BASE_DIR是專案根目錄,我對應的是D:\\Pycharm\\wechat_huoyun,那麼STATIC_ROOT對應的就是D:\\Pycharm\\wechat_huoyun\\static也就是第一張圖裡的1的標記地方。之後在命裡行裡進入到和manage.py相同目錄下執行:

python manage.py collectstatic

6.之後django會自動把專案裡所有靜態檔案,包括admin或者你有多個app下的所有靜態檔案都集合整理到你STATIC_ROOT設定的目錄裡,也就是第一章圖裡標記為1的地方。下次你改動js檔案只要再次執行此命令,然後直接遷移STATIC_ROOT裡的檔案到開發伺服器裡就可以了。現在需要遷移到開發伺服器裡了首先把debug改為False,另外需要設定允許訪問的host:

DEBUG = False
ALLOWED_HOSTS = ['*']

7.之後本地做的事情就OK了,現在需要配置伺服器nginx了:我的檔案在這裡

vim /usr/local/nginx/conf/nginx.conf

配置如下:

        location  /static {
autoindex on;
alias  /root/wechat_huoyun/static;
}

8.這裡配置的location /static 是說請求為/static的靜態檔案都去/root、wechat_huoyun/static下去找,也就是我們專案根目錄下的static去找,而不是我們每個APP下的static檔案下去找,網上有很多教程,關於static的配置寫法也有很多,要注意alias和root的區別,root /path相當於訪問static的時候是訪問/path/static,而alias
/path相當於訪問static時是訪問/path/。所以你要是寫了root /root/wechat_huoyun/static;nginx會去找/root/wechat_huoyun/static/static裡找,那估計就找不到了。

9.設定成這樣的之後,靜態檔案都交給nginx處理,動態請求交給django去處理。然後重啟nginx重啟uwsgi。

10.以為很成功了,但是還是找不到,不是404了而且403.做到這一步,你應該就會明白,其實nginx和django的settings是配置正確的了,因為起碼不是404找不到了,而是被拒絕403,想了想肯定是許可權問題,你專案根目錄裡的static檔案下的js和css檔案都需要讀許可權,包括他的所有父親目錄也都需要讀許可權。

11.這裡需要說明的是我把專案放到了root下了,這是不應該的,因為我需要修改所有父目錄的許可權也就是要把root目錄許可權有改了,不安全,由於我是個人練習的,git和自動化配置都設定後了懶得改了所以直接將root以及子孫目錄一直到static的靜態檔案的許可權都改了:

chmod -R 755 root

12.這裡需要注意的是root我其實沒有改這麼大許可權,我root是555許可權,root子孫目錄是755,本來我以為有讀許可權就可以了,但是還是403,查了查,網上說還需要x許可權,所以我改成了755,所以糾正上面的所有目錄需要讀許可權,是所有目錄都需要讀和執行許可權。至此,大功告成,靜態檔案載入成功!