初次部署django+gunicorn+nginx的方法步驟
環(huán)境 ubuntu16.04 python3.6 django1.11 gunicorn19.7.1 nginx1.10.3
寫在前面
其實無論是在部署,還是在其他方面,我們總會遇到一些問題。建議當感覺自己被卡住的時候,試著退出局部,從更高一層去觀察問題,因為這個事情無論是多復雜,它還是由人設計出來的,它身上多多少少帶著一些人類思考模式的通性(這個表達有點問題,但是我暫時想不出更好的了),嘗試透過現(xiàn)象看本質(zhì),比如這個東西它為什么跑不起來,為什么我打開網(wǎng)頁永遠是404,如果這個時候你直接去問度娘,問逼乎,(我相信能看google的都不會看到這篇東西 :-) )我覺得你很難找到自己想要的答案。我的建議是盡量讓問題細化,網(wǎng)頁打不開,那往往只代表80端口不能訪問,那你可以看看自己服務器的防火墻是不是進制了相關端口,又或者是服務器商幫你設置的安全組是不是把端口都關了;可以嘗試ping一下,看服務器在不在線;看一下我們的代理服務器是不是監(jiān)聽了對的端口,諸如此類。
最后,我認為在絕大多數(shù)情況下,我們踩過的坑,都是有前人踩過,而且還幫我們填掉了,所以用心找,總能找到答案的。
關于Django
先確認在開發(fā)環(huán)境下能夠正常訪問
然后一般情況下,在執(zhí)行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,只有關閉了調(diào)試模式,后面才能讓nginx來尋找靜態(tài)文件。
2.ALLOW_HOSTS,加入你的域名,(或,和)服務器ip。我還加了127.0.0.1方便本地觀察。
3.設置STATIC_ROOT,建議可以直接設為os.path.join(BASE_DIR, 'static/'),也就把文件夾在manage.py的根目錄里。
4.執(zhí)行python manager.py collectstatic,就會將所有靜態(tài)文件都放到第三步中設置的文件地址中。
執(zhí)行完第四步后,目錄結(jié)構(gòu)應該是這樣
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
的解釋,前半截很容易理解,就是調(diào)用了project下的wsgi.py,而后面的application,我一開始以為這個application是要改成自己app的名字,后來才發(fā)現(xiàn),這個實際上是wsgi.py中的變量,所以是固定的,不用改。
試著運行沒問題之后,可以直接在根目錄下創(chuàng)建gunicorn.conf.py
來配置位置,以后運行就用
gunicorn -c gunicorn.conf.py project.wsgi:appliction
因為每次都在命令行輸參數(shù)好累。
我是在docker下面跑的,用nohup來執(zhí)行的時候,會有問題,報import error,應該是環(huán)境變量沒有設置好,但我現(xiàn)在還沒解決這個問題,所以就只用了&。
關于Nginx
我先嘗試講一下我對django + gunicorn + nginx 這三兄弟的理解。首先我們知道,我們訪問網(wǎng)站,就是去網(wǎng)絡上的一臺電腦里訪問某個路徑下的某個文件,那django的作用主要是做(生產(chǎn))這個文件,拿一家餐館來講,我認為django就是這個餐館的廚師,他負責做菜,當規(guī)模很小的時候,比如路邊賣雞蛋餅的大媽,因為客人不多,所以可以自己問客人要什么,然后再自己做,這就是django和自帶的runserver所做的事情;那當規(guī)模變大了,比如普通餐館,客人很多,廚師做菜都來不急了,根本沒時間去問客人要什么,所以這個時候我們就需要服務員了,服務員去記錄客人要什么,然后跟廚房講,接著從廚房拿菜給客人,而在這里,gunicorn就是這個服務員;當規(guī)模更大一些的時候,每分鐘都有幾百個人(現(xiàn)實中來講這已經(jīng)是多到爆炸了吧)要進餐館吃飯,你在餐館里安排再多的服務員也不能處理完這么多客人的請求,而且餐館的空間是有限的,服務員也占空間,多了放不下,所以這個時候怎么辦呢,答案是在餐館門口安排咨客,有序地引導客人進入餐館,也可以在門口就幫客人點好菜,提高整體效率,Nginx就扮演了咨客這個角色。
先來試運行一下nginx,只要啟動nginx這個服務,訪問本地應該就可以看到nginx的歡迎頁了。
因為現(xiàn)在階段知識最簡單的配置,只用到同步worker,所以只需要配置一下監(jiān)聽端口和靜態(tài)文件的地址就可以了。
server{ listen 80;監(jiān)聽的端口 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會將請求轉(zhuǎn)給本地的8080端口,而后面的設置都是一些基本的配置,可以直接用 location /static { alias /home/project/static; } # 這個就是配置靜態(tài)文件的地方,要用絕對地址,對應最開始的目錄形式,假設project就在/home下面,那么這樣配置就可以的了,還有個前提是,你在開發(fā)的時候,采取了django的建議,每個app的靜態(tài)文件都用多了一層app_name的文件夾來包住。 }
在配置靜態(tài)文件的時候,alias /path/to/static
的意思就是直接在這個地址上面找,而root /path/to/static
則是在/path/to/static/static
找,就是說root會自動加一個static。
更改完conf后,就可以nginx -t
檢查一下,ok之后就
service nginx restart
,這樣配置就生效了。
確認gunicorn已經(jīng)運行,那么訪問本地應該就可以看到你的網(wǎng)頁了。
錯誤分析
- 還是看到nginx的歡迎頁。去檢查gunicorn的監(jiān)聽端口,和nginx轉(zhuǎn)發(fā)的端口是否一致;檢查是否啟用了多個gunicorn;如果gunicorn沒有開reload功能,那么在改django代碼之后要手動重啟gunicorn。
- 顯示了網(wǎng)站內(nèi)容,但是靜態(tài)文件都是404,那就是靜態(tài)文件地址配錯了;靜態(tài)文件顯示403,那就是權(quán)限問題,在nginx的配置頭部更改user信息,改成你的用戶,要注意,你用戶有nginx的權(quán)限才行,最簡單就是把用戶加到nginx這個組里面去,當然如果是想立刻看到,直接改成 user root。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
python3報錯check_hostname?requires?server_hostname的解決
這篇文章主要介紹了python3報錯check_hostname?requires?server_hostname的解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12對python打亂數(shù)據(jù)集中X,y標簽對的方法詳解
今天就為大家分享一篇對python打亂數(shù)據(jù)集中X,y標簽對的方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12python?數(shù)據(jù)保存為npy和npz格式并讀取的完整代碼
這篇文章主要介紹了python?數(shù)據(jù)保存為npy和npz格式并讀取,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07解決pip install xxx報錯SyntaxError: invalid syntax的問題
今天小編就為大家分享一篇解決pip install xxx報錯SyntaxError: invalid syntax的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11python、PyTorch圖像讀取與numpy轉(zhuǎn)換實例
今天小編就為大家分享一篇python、PyTorch圖像讀取與numpy轉(zhuǎn)換實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01Python基于requests實現(xiàn)模擬上傳文件
這篇文章主要介紹了Python基于requests實現(xiàn)模擬上傳文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04