前言
最近在用django部署網(wǎng)站www.aihunter.cc,經(jīng)歷各種坑后覺得有必要總結(jié)一下流程以備日后遺忘妨猩。在下閱讀眾多教程后覺得網(wǎng)上還是缺少介紹Ngnix +Uwsgi + virtualenv+django工作流程的概念文章损搬,結(jié)合網(wǎng)上的材料和自己消化本教程將分為概念部分(上篇)以及操作部分(下篇),文中操作內(nèi)容均為自己實際部署時的流程。另外在下職業(yè)非專業(yè)程序員若有錯誤可以在評論中指出蝇裤,我會必第一時間糾正廷支。
如何部署一個django項目呢?
django從本地環(huán)境部署到服務(wù)器上需要服務(wù)器軟件以及用于服務(wù)器和應(yīng)用程序之間通信的
接口(網(wǎng)關(guān))這兩部分支持猖辫。主流的django部署方式有apache + mod_wsgi 或 ngnix + uWSGI酥泞。
Apache 和 Nginx 部署有什么不同呢?
兩者之間的差異主要在服務(wù)器軟件的特點(diǎn)和部署流程上啃憎。
Apache的優(yōu)點(diǎn)在于模塊多芝囤、bug少。
Nginx的優(yōu)點(diǎn)在于占用資源少和配置簡潔辛萍。
其實以上都不是兩者之間的主要差別悯姊,我是小白角度來看它們的優(yōu)點(diǎn)的(哪個最適合吊絲服務(wù)器)。
Nginx 是什么贩毕?它是怎么樣處理請求的悯许?
Nginx 是一個HTTP和反向代理服務(wù)器,Nginx由基礎(chǔ)模塊辉阶、核心模塊先壕、第三方模塊這三類構(gòu)成,Nginx的核心模塊有HTTP模塊谆甜、EVENT模塊垃僚、MALL模塊。
Nginx 處理流程是這樣的规辱,當(dāng)Nginx服務(wù)器收到一個請求后就查找Nginx文件夾下的配置文件conf谆棺,將請求映射到一個location block,然后被映射的location中配置的各個指令會啟動不同的模塊去完成對應(yīng)工作罕袋。
WSGI \ uWSGI \ uwsgi 究竟是什么鬼改淑?它們有什么作用呢?
WSGI是接口規(guī)范浴讯;uWSGI 是服務(wù)器朵夏;uwsgi是uWSGI的自有協(xié)議。定義如下
WSGI
python對web應(yīng)用和web服務(wù)器交互的接口規(guī)范兰珍。
uWSGI
一個基于WSGI規(guī)范的web服務(wù)器(當(dāng)應(yīng)用需要uWSGI和另外一個服務(wù)器連接時侍郭,uWSGI身份就會變成中間件,如Ngnix +uWSGI +django掠河,uWSGI就是一個中間件)
uwsgi
uWSGI服務(wù)器的自有協(xié)議亮元,用于定義傳輸信息的類型。
uWSGI負(fù)責(zé)將請求按照指定協(xié)議解析唠摹,然后把解析的結(jié)果設(shè)置到environ變量中爆捞,接著按照WSG規(guī)范回調(diào)web應(yīng)用,uWsgi默認(rèn)回調(diào)application函數(shù),傳遞eviron和start_response兩個參數(shù)勾拉,最后接受web應(yīng)用處理返回的結(jié)果煮甥。
virtualenv是什么盗温?
virtualenv是用來創(chuàng)建隔離的python環(huán)境,為應(yīng)用創(chuàng)建一個獨(dú)立的安裝目錄成肘,保證不同的運(yùn)行條件下各應(yīng)用的獨(dú)立性卖局。
四者之間的是怎樣進(jìn)行工作的?
首先双霍,Nginx負(fù)責(zé)接受外部客戶端請求并對其htpp請求進(jìn)行解包砚偶,若請求是靜態(tài)文件則根據(jù)設(shè)置好的靜態(tài)文件路徑返回對應(yīng)內(nèi)容。若請求是動態(tài)內(nèi)容則將請求交給uWSGI服務(wù)器(nginx和uWSGI使用socket通信)洒闸。
然后染坯,uWSGI服務(wù)器根據(jù)wsgi協(xié)議解析并回調(diào)virtualenv中的django應(yīng)用。
接著丘逸,django則根據(jù)請求進(jìn)行數(shù)據(jù)庫查找和模版渲染等工作(總之就是返回一個響應(yīng)內(nèi)容)然后再逆方向返回到Nginx
最后单鹿,Nginx將響應(yīng)交給客戶端。
參考
Nginx + uWsgi 部署 Django + Mezzanine 生產(chǎn)服務(wù)
Nginx工作原理和優(yōu)化深纲、漏洞仲锄。