阿里雲部署django網站教程(Ngnix +Uwsgi + virtualenv)上篇

weixin_34054866發表於2017-08-19
6871252-5b4bcb3d5de19e01.jpg

前言

最近在用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將響應交給客戶端。

6871252-e8eef2c1a7666c79.png
伺服器中四者關係圖

參考
Nginx + uWsgi 部署 Django + Mezzanine 生產服務
Nginx工作原理和優化、漏洞。

相關文章