首頁  >  文章  >  後端開發  >  9種python web程式的部署方式小結

9種python web程式的部署方式小結

不言
不言原創
2018-04-16 17:01:521554瀏覽

python有很多web 開發框架,程式碼寫完了,部署上線是個大事,通常來說,web應用程式一般是三層結構web server ---->application -----> DB server

主流的web server 一巴掌就能數出來,apache,lighttpd,nginx,iis

application,中文名叫做應用服務,就是你基於某個web framework寫的應用程式碼DB server 泛指儲存服務,web開發中用mysql比較多,最近幾年因為網站規模擴大,memcache,redis這種key-value等儲存也流行開來
放在最前面的web server 有3個功能

高效率處理靜態檔,web server都是用c開發,呼叫是native的函數,對IO,檔案傳輸都做針對性的最佳化

充當一個簡易的網路防火牆,可以denny一些ip,簡單的控制並發連接數量等等,聊勝於無

處理高並發短連接請求,把成千上萬用戶的request 通過內網的幾十個長連接進行轉發,原因一個是web server處理高並發很專業,另外一個原因是大部分的application所用的框架都不具備處理高並發的能力

實際上,市面上有部分web framework由於內置了支持epoll/kqueue 等高效網路庫,而具備了處理高並發的能力,比如說python的tornado,java系的tomcat,jetty等等,有人就去掉前端的web server,直接裸奔,但是在部署公網應用時候,最好別這樣做,因為前面提到的1,2兩個原因,用戶brower到web server的網絡狀況是千奇百怪,你無法想像的,

web server 強烈建議使用nginx,原因有三

效能非常卓越,非常穩定
安裝簡單,依賴套件少
conf檔案非常容易配置,比apache/lighttpd都要簡單
部署python開發的web程式有9種方法

mod_python ,這是apache內建的模組,很嚴重的依賴mod_python編譯使用的python版本,和apache配套使用,不推薦

cgi ,這個太old,不推薦,而且nginx不支援cgi方式,只能用lighttpd或apache

fastcgi  ,這個是目前流行最廣的做法,透過flup模組來支援的,在nginx裡對應的設定指令是fastcgi_pass

spawn-fcgi ,這個是fastcgi多進程管理程序,lighttpd安裝包附帶的,和flup效果一樣,區別是flup是python代碼級引入,spawn-fcgi是外部程序。 spawn-fcgi用途很廣,可以支援任意語言開發的程式碼,php,python,perl,只要你程式碼實現了fastcgi接口,它都可以幫你管理你的進程

scgi ,全名是Simple Common Gateway Interface,也是cgi的替代版本, scgi協定很簡單,我覺得和fastcgi差不多,只是沒有怎麼推廣開來,nginx對應的設定指令是scgi_pass,你想用就用,flup也支援。

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

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)等等

Gunicorn ,和uwsgi類似的工具,從rails的部署工具(Unicorn)移植過來的。但它使用的協定是WSGI,全名為Python Web Server Gateway Interface ,這是python2.5時定義的官方標準( PEP 333  ),根紅苗正,而且部署比較簡單, http://gunicorn.org/  上有詳細教學

mod_wsgi ,apache的一個module,也是支援WSGI協定, https://code.google.com/p/modwsgi/

fastcgi協定和http協定在程式碼部署中的的優劣對比

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池耗幹,你的伺服器只能拒絕回應了

總結

#我個人習慣是用fastcgi 協定部署python程序,簡單省事,選擇技術方案,一定要選擇最簡單最常見的,本部落格的fastcgi運行腳本如下

kill - `cat / tmp / django.pid`
echo 'restart django....' 
python . / manage.py runfcgi - - settings = lutaf.settings_r maxchildren =  maxspare = minspare =  method = prefork pidfile = / tmp / django.pid host = 127.0 . 0.1  port = outlog = / tmp / dj.out errlog = / tmp / dj.error

推薦大家嘗試Gunicorn ,這是未來發展方向

#

以上是9種python web程式的部署方式小結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn