幾個概念:WSGI,uWSGI,uwsgi,Nginx
WSGI
WSGI的全稱是Web Server Gateway Interface(Web伺服器閘道器介面),它不是伺服器、python模組、框架、API或者任何軟體,只是一種描述web伺服器(如nginx,uWSGI等伺服器)如何與web應用程式(如用Django、Flask框架寫的程式)通訊的規範。
server和application的規範在PEP3333中有具體描述,要實現WSGI協議,必須同時實現web server和web application,當前執行在WSGI協議之上的web框架有Bottle, Flask, Django。
uWSGI
uWSGI是一個全功能的HTTP伺服器,實現了WSGI協議、uwsgi協議、http協議等。它要做的就是把HTTP協議轉化成語言支援的網路協議。比如把HTTP協議轉化成WSGI協議,讓Python可以直接使用。
uwsgi
與WSGI一樣,是uWSGI伺服器的獨佔通訊協議,用於定義傳輸資訊的型別(type of information)。每一個uwsgi packet前4byte為傳輸資訊型別的描述,與WSGI協議是兩種東西,據說該協議是fcgi協議的10倍快。
Nginx
Nginx是一個Web伺服器其中的HTTP伺服器功能和uWSGI功能很類似,但是Nginx還可以用作更多用途,比如最常用的反向代理功能。
Django
Django是一個Web框架,框架的作用在於處理request和 reponse,其他的不是框架所關心的內容。所以如何部署Django不是Django所需要關心的。
Django所提供的是一個開發伺服器,這個開發伺服器,沒有經過安全測試,而且使用的是Python自帶的simple HTTPServer 建立的,在安全性和效率上都是不行的。
以下是最新版本Django有關runserver command的程式碼節選
其中inner_run函式中的run方法和run方法中server_cls 引數分別取自
在Django原始碼中可以很清楚的看出來,runserver起來的HTTPServer 就是Python自帶的simple_server。而WSGIServer的父類就是wsgiref.simple_server。既然是simple了很多東西都是不太可以的。
訪問過程
用一張圖來描述一下上述過程:
一個成熟的站點提供服務,需要Web伺服器(靜態資料)和App伺服器(動態資料)。Web伺服器目前屬Nginx最強大,使用者請求代理過來後,把資料返回給請求客戶端。但是目前的網際網路發展時代,都是包含動態資料處理的,這樣一般Nginx不處理業務邏輯,都外包給後端的App伺服器,就是你的django伺服器。
在需要效能優化的場景,通常單單nginx和uWSGI也是不夠的。nginx主要優化的是連線數和靜態文,uWSGI主要優化的是wsgi 服務,這些都只是手段。其它手段包括,優化資料庫,增加快取,加入負載均衡器,引入非同步IO框架(如gunicorn 伺服器的gevent框架),計算密集型模組用C重寫等。 安全性方面,也會有很多考慮,這裡不展開。