寫在前面,這只是我所遇到的狀況,若是有錯請必定要告訴我,轉載請註明出處,碼字不易,謝謝。
環境 ubuntu16.04 python3.6 django1.11 gunicorn19.7.1 nginx1.10.3css
其實不管是在部署,仍是在其餘方面,咱們總會遇到一些問題。建議當感受本身被卡住的時候,試着退出局部,從更高一層去觀察問題,由於這個事情不管是多複雜,它仍是由人設計出來的,它身上多多少少帶着一些人類思考模式的通性(這個表達有點問題,可是我暫時想不出更好的了),嘗試透過現象看本質,好比這個東西它爲何跑不起來,爲何我打開網頁永遠是404,若是這個時候你直接去問度娘,問逼乎,(我相信能看google的都不會看到這篇東西 :-) )我以爲你很難找到本身想要的答案。個人建議是儘可能讓問題細化,網頁打不開,那每每只表明80端口不能訪問,那你能夠看看本身服務器的防火牆是否是進制了相關端口,又或者是服務器商幫你設置的安全組是否是把端口都關了;能夠嘗試ping一下,看服務器在不在線;看一下咱們的代理服務器是否是監聽了對的端口,諸如此類。python
最後,我認爲在絕大多數狀況下,咱們踩過的坑,都是有前人踩過,並且還幫咱們填掉了,因此用心找,總能找到答案的。nginx
先確認在開發環境下可以正常訪問docker
而後通常狀況下,在執行python manager.py startproject project
以後,目錄應該是這個樣子的django
project/ --project/ --__init__.py --setting.py --urls.py --wsgi.py --templates/ --your app/ --manage.py
設置project/setting.py
ubuntu
要更改的幾個點安全
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/
一開始能夠先試着運行一下,進入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
,應該是環境變量沒有設置好,但我如今還沒解決這個問題,因此就只用了&
。
我先嚐試講一下我對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已經運行,那麼訪問本地應該就能夠看到你的網頁了。
錯誤分析