Python的Web開發中,若是使用Django框架,那麼較爲成熟穩定的服務器架構通常是Nginx+uWSGI+Django。而爲何必定要三個結合在一塊兒呢?直接使用Django的runserver來啓動服務器進程,或者uWSGI+Django可不能夠呢?爲何?
概念說明:html
Web協議出現順序:
CGI -> FCGI -> WSGI -> uwsgipython
瀏覽器請求一個頁面的流程:git
一個網站,通常有不少個不一樣的請求,在這些請求中,基本1,2,4,5部都是固定的,變的只有第三步,因此把這四步抽象出來,讓開發者只關注第三步,這樣就能夠極大提高開發效率。因此WSGI協議誕生了。
WSGI,全稱 Web Server Gateway Interface。是Python專用的協議,其餘語言沒有。用於處理Web服務器和應用程序(APP)的交互信息。不少Web框架(如:django)都會自帶WSGI服務器,可是性能很差,只做測試用途。github
實現一個最簡單的服務器web
import pprint
def application(environ, start_response):
pprint.pprint(environ)
start_response('200 OK',[('Content-Type','text/html')])
return'<h1>Hello, web!</h1>'
# 從wsgiref模塊導入:
from wsgiref.simple_server import make_server
# 導入咱們本身編寫的application函數:
from app import application
# 建立一個服務器,IP地址爲空,端口是8000,處理函數是application:
httpd = make_server('',8000, application)
print"Serving HTTP on port 8000..."
# 開始監聽HTTP請求:
httpd.serve_forever()
python server.py
,就能夠經過localhost:8000訪問了wsgiref模塊是python提供的,用於測試和學習的簡單的WSGI服務器模塊。
這個模塊監聽8000端口,把Http請求,根據WSGI協議,轉換application函數中的environ參數,而後調用application函數。
wsgiref會把application函數提供的響應頭設置轉換爲HTTP協議的響應頭,把application的返回(return)做爲響應體,根據HTTP協議,生成響應,返回給瀏覽器。django
這樣,應用程序就不須要關注底層的HTTP協議細則了瀏覽器
CGI是Common Gateway Interface,即通用網關接口,是一個協議,是外部應用程序(CGI程序)與Web服務器之間的接口標準。該協議定義了Web服務器在調用應用程序時須要傳輸的參數和應用程序怎麼返回結果給Web服務器,其實跟WSGI相似。
CGI的一個特色是,對於每個HTTP請求,Web服務器都會新建一個進程(fork),等應用程序返回結果後,這個進程就會結束。這樣的後果是,一旦HTTP請求多的時候,Web服務器會頻繁建立進程,你們都知道,建立進程的開銷是很是大的,因此這種作法會影響服務器的性能,因此就有了FastCGI。
FCGI的作法是在Web服務器啓動的時候,就建立多個應用程序進程,當Web服務器接收到HTTP請求時,就把請求分發給其中一個空閒的進程。至關於MYSQL鏈接池的原理。這樣就能夠避免頻繁地fork進程。FCGI另外一個特色是支持分佈式,也就是Web服務器和應用程序能夠在不一樣的機器。
CGI和WSGI的區別是:安全
Ningx是一個反向代理服務器
什麼是反向代理?服務器
反向代理的做用:網絡
Nginx是一個高性能的HTTP和反向代理服務器。
Nginx+uWSGI+應用程序的架構:
其中Nginx和uWSGI之間能夠經過CGI,FCGI和uwsgi協議通訊,固然uwsgi的性能是最好的。
最後附上一個介紹Nginx+uWSGI+Django的幻燈片
參考:
http://www.biaodianfu.com/cgi-fastcgi-wsgi.html
http://blog.csdn.net/qiaofeiw/article/details/9207359
http://www.cnblogs.com/wanghetao/p/3934350.html
http://book.51cto.com/art/201202/314840.htm
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832689740b04430a98f614b6da89da2157ea3efe2000
https://www.douban.com/note/13508388/
http://www.nowamagic.net/academy/detail/1330308
http://www.itopers.com:8080/?p=586