1. 程式人生 > 程式設計 >初次部署django+gunicorn+nginx的方法步驟

初次部署django+gunicorn+nginx的方法步驟

環境 ubuntu16.04 python3.6 django1.11 gunicorn19.7.1 nginx1.10.3

寫在前面

其實無論是在部署,還是在其他方面,我們總會遇到一些問題。建議當感覺自己被卡住的時候,試著退出區域性,從更高一層去觀察問題,因為這個事情無論是多複雜,它還是由人設計出來的,它身上多多少少帶著一些人類思考模式的通性(這個表達有點問題,但是我暫時想不出更好的了),嘗試透過現象看本質,比如這個東西它為什麼跑不起來,為什麼我開啟網頁永遠是404,如果這個時候你直接去問度娘,問逼乎,(我相信能看google的都不會看到這篇東西 :-) )我覺得你很難找到自己想要的答案。我的建議是儘量讓問題細化,網頁打不開,那往往只代表80埠不能訪問,那你可以看看自己伺服器的防火牆是不是進位制了相關埠,又或者是伺服器商幫你設定的安全組是不是把埠都關了;可以嘗試ping一下,看伺服器在不線上;看一下我們的代理伺服器是不是監聽了對的埠,諸如此類。

最後,我認為在絕大多數情況下,我們踩過的坑,都是有前人踩過,而且還幫我們填掉了,所以用心找,總能找到答案的。

關於Django

先確認在開發環境下能夠正常訪問

然後一般情況下,在執行python manager.py startproject project之後,目錄應該是這個樣子的

project/
  --project/
    --__init__.py
    --setting.py
    --urls.py
    --wsgi.py
  --templates/
  --your app/
  --manage.py

設定project/setting.py

要更改的幾個點

1.DEBUG改成False,只有關閉了除錯模式,後面才能讓nginx來尋找靜態檔案。

2.ALLOW_HOSTS,加入你的域名,(或,和)伺服器ip。我還加了127.0.0.1方便本地觀察。

3.設定STATIC_ROOT,建議可以直接設為os.path.join(BASE_DIR,'static/'),也就把資料夾在manage.py的根目錄裡。

4.執行python manager.py collectstatic,就會將所有靜態檔案都放到第三步中設定的檔案地址中。

執行完第四步後,目錄結構應該是這樣

project/
  --project/
    --__init__.py
    --setting.py
    --urls.py
    --wsgi.py
  --templates/
  --your app/
  --manage.py
  --static/
    --auth/
    --your app/
      --css/
      --js/
      --images/

關於Gunicorn

一開始可以先試著執行一下,進入project這個根目錄,然後

gunicorn -w 3 -b 127.0.0.1:8080 project.wsgi:application

不出意外,就應該可以跑起來了。

關於project.wsgi:application的解釋,前半截很容易理解,就是呼叫了project下的wsgi.py,而後面的application,我一開始以為這個application是要改成自己app的名字,後來才發現,這個實際上是wsgi.py中的變數,所以是固定的,不用改。

試著執行沒問題之後,可以直接在根目錄下建立gunicorn.conf.py

來配置位置,以後執行就用

gunicorn -c gunicorn.conf.py project.wsgi:appliction

因為每次都在命令列輸引數好累。

我是在docker下面跑的,用nohup來執行的時候,會有問題,報import error,應該是環境變數沒有設定好,但我現在還沒解決這個問題,所以就只用了&。

關於Nginx

我先嚐試講一下我對django + gunicorn + nginx 這三兄弟的理解。首先我們知道,我們訪問網站,就是去網路上的一臺電腦裡訪問某個路徑下的某個檔案,那django的作用主要是做(生產)這個檔案,拿一家餐館來講,我認為django就是這個餐館的廚師,他負責做菜,當規模很小的時候,比如路邊賣雞蛋餅的大媽,因為客人不多,所以可以自己問客人要什麼,然後再自己做,這就是django和自帶的runserver所做的事情;那當規模變大了,比如普通餐館,客人很多,廚師做菜都來不急了,根本沒時間去問客人要什麼,所以這個時候我們就需要服務員了,服務員去記錄客人要什麼,然後跟廚房講,接著從廚房拿菜給客人,而在這裡,gunicorn就是這個服務員;當規模更大一些的時候,每分鐘都有幾百個人(現實中來講這已經是多到爆炸了吧)要進餐館吃飯,你在餐館裡安排再多的服務員也不能處理完這麼多客人的請求,而且餐館的空間是有限的,服務員也佔空間,多了放不下,所以這個時候怎麼辦呢,答案是在餐館門口安排諮客,有序地引導客人進入餐館,也可以在門口就幫客人點好菜,提高整體效率,Nginx就扮演了諮客這個角色。

先來試執行一下nginx,只要啟動nginx這個服務,訪問本地應該就可以看到nginx的歡迎頁了。

因為現在階段知識最簡單的配置,只用到同步worker,所以只需要配置一下監聽埠和靜態檔案的地址就可以了。

server{
  listen 80;監聽的埠
  server_name 127.0.0.1;
  server_name 111.111.111.111;
  server_name your_www;
  #當請求這些server name的時候,nginx才會做反向代理,0.0.0.0是指全部
  location / {
   proxy_pass http://127.0.0.1:8080;
   proxy_set_header Host $host;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Forwarded-Proto $scheme;
  }
  # location 顧名思義,定位,就是當訪問 / 的時候,nginx會將請求轉給本地的8080埠,而後面的設定都是一些基本的配置,可以直接用
  location /static {
   alias /home/project/static;
  }
  # 這個就是配置靜態檔案的地方,要用絕對地址,對應最開始的目錄形式,假設project就在/home下面,那麼這樣配置就可以的了,還有個前提是,你在開發的時候,採取了django的建議,每個app的靜態檔案都用多了一層app_name的資料夾來包住。
}

在配置靜態檔案的時候,alias /path/to/static的意思就是直接在這個地址上面找,而root /path/to/static則是在/path/to/static/static找,就是說root會自動加一個static。

更改完conf後,就可以nginx -t檢查一下,ok之後就

service nginx restart,這樣配置就生效了。

確認gunicorn已經執行,那麼訪問本地應該就可以看到你的網頁了。

錯誤分析

  • 還是看到nginx的歡迎頁。去檢查gunicorn的監聽埠,和nginx轉發的埠是否一致;檢查是否啟用了多個gunicorn;如果gunicorn沒有開reload功能,那麼在改django程式碼之後要手動重啟gunicorn。
  • 顯示了網站內容,但是靜態檔案都是404,那就是靜態檔案地址配錯了;靜態檔案顯示403,那就是許可權問題,在nginx的配置頭部更改user資訊,改成你的使用者,要注意,你使用者有nginx的許可權才行,最簡單就是把使用者加到nginx這個組裡面去,當然如果是想立刻看到,直接改成 user root。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。