前言
最近在用django部署網站www.aihunter.cc,經歷各種坑后覺得有必要總結一下流程以備日后遺忘。在下閱讀眾多教程后覺得網上還是缺少介紹Ngnix +Uwsgi + virtualenv+django工作流程的概念文章,結合網上的材料和自己消化本教程將分為概念部分(上篇)以及操作部分(下篇),文中操作內容均為自己實際部署時的流程。另外在下職業非專業程序員若有錯誤可以在評論中指出,我會必第一時間糾正。
如何部署一個django項目呢?
django從本地環境部署到服務器上需要服務器軟件以及用于服務器和應用程序之間通信的
接口(網關)這兩部分支持。主流的django部署方式有apache + mod_wsgi 或 ngnix + uWSGI。
Apache 和 Nginx 部署有什么不同呢?
兩者之間的差異主要在服務器軟件的特點和部署流程上。
Apache的優點在于模塊多、bug少。
Nginx的優點在于占用資源少和配置簡潔。
其實以上都不是兩者之間的主要差別,我是小白角度來看它們的優點的(哪個最適合吊絲服務器)。
Nginx 是什么?它是怎么樣處理請求的?
Nginx 是一個HTTP和反向代理服務器,Nginx由基礎模塊、核心模塊、第三方模塊這三類構成,Nginx的核心模塊有HTTP模塊、EVENT模塊、MALL模塊。
Nginx 處理流程是這樣的,當Nginx服務器收到一個請求后就查找Nginx文件夾下的配置文件conf,將請求映射到一個location block,然后被映射的location中配置的各個指令會啟動不同的模塊去完成對應工作。
WSGI \ uWSGI \ uwsgi 究竟是什么鬼?它們有什么作用呢?
WSGI是接口規范;uWSGI 是服務器;uwsgi是uWSGI的自有協議。定義如下
WSGI
python對web應用和web服務器交互的接口規范。
uWSGI
一個基于WSGI規范的web服務器(當應用需要uWSGI和另外一個服務器連接時,uWSGI身份就會變成中間件,如Ngnix +uWSGI +django,uWSGI就是一個中間件)
uwsgi
uWSGI服務器的自有協議,用于定義傳輸信息的類型。
uWSGI負責將請求按照指定協議解析,然后把解析的結果設置到environ變量中,接著按照WSG規范回調web應用,uWsgi默認回調application函數,傳遞eviron和start_response兩個參數,最后接受web應用處理返回的結果。
virtualenv是什么?
virtualenv是用來創建隔離的python環境,為應用創建一個獨立的安裝目錄,保證不同的運行條件下各應用的獨立性。
四者之間的是怎樣進行工作的?
首先,Nginx負責接受外部客戶端請求并對其htpp請求進行解包,若請求是靜態文件則根據設置好的靜態文件路徑返回對應內容。若請求是動態內容則將請求交給uWSGI服務器(nginx和uWSGI使用socket通信)。
然后,uWSGI服務器根據wsgi協議解析并回調virtualenv中的django應用。
接著,django則根據請求進行數據庫查找和模版渲染等工作(總之就是返回一個響應內容)然后再逆方向返回到Nginx
最后,Nginx將響應交給客戶端。
參考
Nginx + uWsgi 部署 Django + Mezzanine 生產服務
Nginx工作原理和優化、漏洞。