python有不少web 開發框架,代碼寫完了,部署上線是個大事,一般來講,web應用通常是三層結構php
Web Server====》 Application=====》 DB Serverhtml
主流的web server 一個巴掌就能數出來,apache,lighttpd,nginx,iis
application,中文名叫作應用服務,就是你基於某個web framework寫的應用代碼
DB server 泛指存儲服務,web開發中用mysql比較多,最近幾年由於網站規模擴大,memcache,redis這種key-value等存儲也流行開來前端
高效率處理靜態文件,web server都是用c開發,調用是native的函數,對IO,文件傳輸都作針對性的優化java
充當一個簡易的網絡防火牆,能夠denny一些ip,簡單的控制併發鏈接數量等等,聊勝於無python
處理高併發短鏈接請求,把成千上萬用戶的request 經過內網的幾十個長鏈接進行轉發,緣由一個是web server處理高併發很專業,另一個緣由是大部分的application所用的框架都不具有處理高併發的能力mysql
實際上,市面上有部分web framework因爲內置了支持epoll/kqueue 等高效網絡庫,而具有了處理高併發的能力,好比說 python的tornado,java系的tomcat,jetty等等,有人就去掉前端的web server,直接裸奔,可是在部署公網應用時候,最好別這樣作,由於前面提到的1,2兩個緣由,用戶brower到web server的網絡情況是千奇百怪,你沒法想象的,nginx
web server 強烈建議使用nginx,緣由有三程序員
性能很是卓越,很是穩定
安裝簡單,依賴包少
conf文件很是容易配置,比apache/lighttpd都要簡單web
1.mod_python,這是apache內置的模塊,很嚴重的依賴於mod_python編譯使用的python版本,和apache配套使用,不推薦redis
2.cgi,這個太old,不推薦,並且nginx不支持cgi方式,只能用lighttpd或者apache
3.fastcgi ,這個是目前流行最廣的作法,經過flup模塊來支持的,在nginx裏對應的配置指令是 fastcgi_pass
4.spawn-fcgi,這個是fastcgi多進程管理程序,lighttpd安裝包附帶的,和 flup效果同樣,區別是flup是 python代碼級引入,spawn-fcgi是外部程序。spawn-fcgi用途很廣,能夠支持任意語言開發的代碼,php,python,perl,只要你代碼實現了fastcgi接口,它均可以幫你管理你的進程
5.scgi,全名是Simple Common Gateway Interface,也是cgi的替代版本,scgi協議很簡單,我以爲和fastcgi差很少,只是沒有怎麼推廣開來,nginx對應的配置指令是scgi_pass,你想用就用,flup也支持。
6.http,nginx使用proxy_pass轉發,這個要求後端appplication必須內置一個能處理高併發的http server,在python的web框架當中,只能選擇tornado.
python程序員喜歡發明輪子,tornado除了是一個web framework以外,它還能夠單獨提供高性能http server,因此,若是你採用其餘python框架寫代碼,好比說bottle,也同樣能夠經過import tornado 來啓動一個高性能的http server,一樣的能夠採用http協議和nginx一塊兒來部署。擴展開來,python包裏面能處理高併發的http server還有不少,好比說gevent,也能夠被其餘框架引用來支持http方式部署。
現實當中,用java來作web程序,一般就用http和nginx配合,應用服務器選擇tomcat或者jetty
7.uwsgi,包括4部分組成,
uwsgi協議
web server內置支持協議模塊
application服務器協議支持模塊
進程控制程序
nginx從0.8.4開始內置支持uwsgi協議,uwsgi協議很是簡單,一個4個字節header+一個body,body能夠是不少協議的包,好比說http,cgi等(經過header裏面字段標示),我曾經作個一個小規模的性能對比測試,結果代表,uwsgi和fastcgi相比,性能沒有太明顯的優點,也多是數據集較小的緣由
uwsgi的特色在於自帶的進程控制程序.它是用c語言編寫,使用natvie函數,其實和spawn-fcgi/php-fpm相似。因此uwsgi能夠支持多種應用框架,包括(python,lua,ruby,erlang,go)等等
8.Gunicorn,和uwsgi相似的工具,從rails的部署工具(Unicorn)移植過來的。可是它使用的協議是 WSGI,全稱是Python Web Server Gateway Interface ,這是python2.5時定義的官方標準(PEP 333 ),根紅苗正,並且部署比較簡單,http://gunicorn.org/ 上有詳細教程
9.mod_wsgi,apache的一個module,也是支持WSGI協議,https://code.google.com/p/modwsgi/
fastcgi雖然是二進制協議,相對於http協議,並不節省資源。二進制協議,只能節省數字的表達,好比 1234567,用字符串表示須要7個Byte,用數字就是4個Byte,而字符串到哪裏都同樣
fastcgi在傳輸數據的時候,爲了兼容cgi協議,還要帶上一堆cgi的環境變量,因此和http協議相比,用fastcgi傳輸數據並不省,反而多一些
fastcgi 惟一的優勢是,它是長鏈接的,用戶併發1000個request,fastcgi可能就用10個 連接轉發給後端的appplication,若是用http協議,那來多少給多少,會向後端appplication 發起1000個請求
http代理轉發方式,在面對超高併發的狀況下會出問題,由於,tcp協議棧當中,port是int16整型 你本地新建一個connect,須要消耗一個端口,最多能到65536。外部併發幾十萬個請求,port池耗幹,你的服務器只能拒絕響應了
推薦使用gunicorn
官網: gunicorn http://gunicorn.org
前輩研究gunicorn源碼的成果: 閱讀gunicorn代碼 v0.0.1 文檔 http://gunicorn.readthedocs.io/en/latest/
原文連接:
http://www.open-open.com/lib/view/open1385131452292.html
識別圖中二維碼,領取python全套視頻資料