前幾日在生產服務器上部署Python web.py的一個項目,發現本身對服務器的一些概念不是很明白,遂查資料看了一會,特此作出我的的一些算是筆試的總結吧,以便以後能夠回顧html
全稱是Web Server Gateway Interface
,WSGI不是服務器,也不是API或者Python的什麼模塊之類的,它只是一種Python web的一種規範,相似於Java web裏面的servlet規範,WSGI規範定義了web應用(web框架)與web服務器之間交互的接口,約定了WSGI server怎麼去調用web應用程序類或者函數,web應用程序須要符合什麼樣的規範。而下面說的uWSGI就是一種支持WSGI規範的服務器,或者你能夠將uWSGI理解爲一種支持WSGI規範的容器,因此咱們能夠將web應用部署到uWSGI中,而後當它接受請求時,就會按照WSGI定義的接口回調web應用來處理請求。
WSGI定義了兩種角色,分別爲server端(或者gateway端)和application端(或者framework端),須要server端和application端都支持WSGI,通常而言server端是uWSGI,application端是一個可調用對象(callable object),可調用對象能夠是類、方法或者可調用的實例,這個對象接受兩個參數environ(請求的環境變量)和start_response(回調函數)。python
def simple_app(environ, start_response): """ docstring, it's just a test application """ status = '200 OK' response_headers = [('Content-type', 'text/html')] start_response(status, response_headers) return ['Hello World']
上面的回調函數的做用是讓WSGI server返回響應的首部和HTTP狀態碼,這個函數必須有兩個參數,第一個是狀態碼,第二個是響應的首部元組組成的列表,而且回調函數設置狀態碼和首部須要在return響應HTTP body以前執行。
值得一說的是,return返回的響應信息應該是一個可迭代對象,上面的例子中將字符串放在了列表裏面,若是直接返回字符串,會致使WSGI服務器對字符串進行迭代而影響速度。nginx
是一個web服務器,實現了WSGI協議、uwsgi協議、http協議等git
一種規範,或者說是一種通訊協議,主要用在代理服務器(如Nginx)與uWSGI服務器之間的通訊,而WSGI主要是用在uWSGI服務器和應用程序之間的通訊。github
從上面能夠看出,Nginx這一層並非必須的,uWSGI服務器徹底能夠完成整個和瀏覽器的交互,可是須要考慮下面的狀況web
參考文章:
python nginx+uwsgi+WSGI 處理請求詳解
Nginx + uWSGI + Webpy配置&原理.mddjango