初次部署django+gunicorn+nginx

寫在前面,這只是我所遇到的狀況,若是有錯請必定要告訴我,轉載請註明出處,碼字不易,謝謝。
環境 ubuntu16.04 python3.6 django1.11 gunicorn19.7.1 nginx1.10.3css


寫在前面

其實不管是在部署,仍是在其餘方面,咱們總會遇到一些問題。建議當感受本身被卡住的時候,試着退出局部,從更高一層去觀察問題,由於這個事情不管是多複雜,它仍是由人設計出來的,它身上多多少少帶着一些人類思考模式的通性(這個表達有點問題,可是我暫時想不出更好的了),嘗試透過現象看本質,好比這個東西它爲何跑不起來,爲何我打開網頁永遠是404,若是這個時候你直接去問度娘,問逼乎,(我相信能看google的都不會看到這篇東西 :-) )我以爲你很難找到本身想要的答案。個人建議是儘可能讓問題細化,網頁打不開,那每每只表明80端口不能訪問,那你能夠看看本身服務器的防火牆是否是進制了相關端口,又或者是服務器商幫你設置的安全組是否是把端口都關了;能夠嘗試ping一下,看服務器在不在線;看一下咱們的代理服務器是否是監聽了對的端口,諸如此類。python

最後,我認爲在絕大多數狀況下,咱們踩過的坑,都是有前人踩過,並且還幫咱們填掉了,因此用心找,總能找到答案的。nginx

關於Django

先確認在開發環境下可以正常訪問docker

而後通常狀況下,在執行python manager.py startproject project以後,目錄應該是這個樣子的django

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

設置project/setting.pyubuntu

要更改的幾個點安全

1.DEBUG改爲False,只有關閉了調試模式,後面才能讓nginx來尋找靜態文件。服務器

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

3.設置STATIC_ROOT,建議能夠直接設爲os.path.join(BASE_DIR, 'static/'),也就把文件夾在manage.py的根目錄裏。app

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。。
相關文章
相關標籤/搜索