概述
在Python開發的web應用中,我們通常能夠看到flask、uWSGI、Nginx出現在一起,他們之間的關系是什么?為什么總是被應用在一起?
三者共同使用為了實現一個目的:客戶端向服務端發送數據請求,服務端根據應用代碼邏輯返回客戶端需要的數據。
說明:
(1)既然客戶端可以請求服務端的數據,那么客戶端與服務端肯定是可以通信的,通信是由誰來完成的呢?就是web server:Nginx.
(2)服務端根據應用代碼邏輯給出客戶端需要的數據,那么你的web 服務器就需要能夠理解應用代碼并且能夠運行應用代碼拿到結果。那么這一功能是由誰來完成的呢?就是應用服務器:uWSGI.
他們三者分別是什么?
Flask:
Flask是目前十分流行的web框架,采用Python編程語言來實現相關功能。它被稱為微框架(microframework),程序員可以使用Python語言快速實現一個網站或Web服務。
Nginx:
Nginx是一個web 服務器,即HTTP Server, 一個 HTTP Server 關心的是 HTTP 協議層面的傳輸和訪問控制,所以在 Apache/Nginx 上你可以看到代理、負載均衡等功能。客戶端通過 HTTP Server 訪問服務器上存儲的資源(HTML 文件、圖片文件等等)。
uWSGI:
uWSGI是應用服務器,是一個應用執行的容器。它首先需要支持開發語言的 Runtime(對于 Tomcat 來說,就是 Java),保證應用能夠在應用服務器上正常運行。其次,需要支持應用相關的規范,例如類庫、安全方面的特性。對于 Tomcat 來說,就是需要提供 JSP/Sevlet 運行需要的標準類庫、Interface 等。為了方便,應用服務器往往也會集成 HTTP Server 的功能,但是不如專業的 HTTP Server 那么強大,所以應用服務器往往是運行在 HTTP Server 的背后(所以需要配合Nginx使用—所以 Nginx+uWSGI),執行應用,將動態的內容轉化為靜態的內容之后,通過 HTTP Server 分發到客戶端。
WSGI:
WSGI 是一種 Web 服務器網關接口。WSGI,全稱 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是為 Python 語言定義的 Web 服務器 和 Web 應用程序或框架之間的一種簡單而通用的接口。自從 WSGI 被開發出來以后,許多其它語言中也出現了類似接口。
WSGI 的官方定義是,the Python Web Server Gateway Interface。從名字就可以看出來,這東西是一個Gateway,也就是網關。網關的作用就是在協議之間進行轉換。
它是一 個 Web 服務器(如 nginx,uWSGI 等服務器)與 web 應用(如用 Flask 框架寫的程序)通信的一種 規范。WSGI協議其實是定義了一種server與application解耦的規范,即可以有多個實現WSGI server的服務器,也可以有多個實現WSGI application的框架,那么就可以選擇任意的server和application組合實現自己的web應用。例如uWSGI和Gunicorn都是實現了WSGI server協議的服務器,Django,Flask是實現了WSGI application協議的web框架,可以根據項目實際情況搭配使用。
綜上:
flask是使用Python進行web開發的框架,而通過Python編寫的代碼如果想對外提供服務,需要有一個web server,也就是Nginx,實現與客戶端的通信;但是理論上web server與應用程序之間是無法通信的,他們之間也需要有一個橋梁,這個橋梁就是uWSGI,uWSGI通過WSGI這個協議,將web server的請求轉換成應用程序可以理解的request,與應用程序進行動態數據交互,將請求到的數據轉換成web server可以理解的形式,由 web server將數據最終返回給請求的客戶端。
是否可以不使用Nginx?
可以,uWSGI本身也可以作為web server使用,只是它本身的性能非常有限,為了方便,應用服務器往往也會集成 HTTP Server 的功能,但是不如專業的 HTTP Server 那么強大,所以應用服務器往往是運行在 HTTP Server 的背后為 web server 與 應用程序 提供 通信的橋梁。