WSGI、uWSGI、uwsgi、Nginx概念知識及uWSGI+Django+Nginx的工作原理流程與部署歷程

uWSGI+Django+Nginx的工作原理流程與部署歷程:https://blog.csdn.net/c465869935/article/details/53242126

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的代碼節選:

django.core.management.commands.runserver.Command:run

django.core.management.commands.runserver.Command:inner_run

其中inner_run函數中的run方法和run方法中server_cls 參數分別取自

django.core.servers.basehttp:run

django.core.servers.basehttp:WSGIServer

在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重寫等。 安全性方面,也會有很多考慮,這裏不展開。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章