解說uwsgi

通過Python/WSGI應(yīng)用快速入門解說,說是uwsgi入門,真的入門了嘛?

第一個WSGI應(yīng)用說到并發(fā)性魯棒性

1. 啟動方式

方式1(http路由):uwsgi --http :9090 --wsgi-file foobar.py

uWSGI默認(rèn)以單進(jìn)程單線程方式啟動,但在這前端還有1個進(jìn)程監(jiān)聽http端口9090,即一個HTTP路由,路由將9090端口的請求傳遞到WSGI應(yīng)用進(jìn)程? (worker),進(jìn)程管理它并把響應(yīng)發(fā)送回HTTP路由器 (接著路由器發(fā)送回客戶端)。啟動同時uWSGI Python加載器搜索指定wsgi-file文件的默認(rèn)函數(shù)application。

方式2(非http路由):uwsgi --http-socket :9090 --wsgi-file? foobar.py或uwsgi --socket :9090? --wsgi-file? foobar.py

uWSGI默認(rèn)以單進(jìn)程單線程方式啟動,監(jiān)聽http端口9090,請求直接傳遞到WSGI應(yīng)用進(jìn)程 (worker),返回響應(yīng)給客戶端。啟動同時uWSGI Python加載器搜索指定wsgi-file文件的默認(rèn)函數(shù)application。

2. 并發(fā)性

單進(jìn)程單線程滿足不了增長的業(yè)務(wù)并發(fā),uwsgi支持多線程、多進(jìn)程或各種異步模式為你的應(yīng)用提供并發(fā)性。

要擁有額外的線程,用--threads:uwsgi --http :9090 --wsgi-file foobar.py --threads 3

要擁有額外的進(jìn)程,用--processes:uwsgi --http :9090 --wsgi-file foobar.py --processes 3

要擁有額外的進(jìn)程和線程(3個進(jìn)程每個進(jìn)程下3個線程):uwsgi --http :9090 --wsgi-file foobar.py --processes 3 --threads 3

perl世界中一個非常常見的非阻塞/協(xié)程庫是Coro::AnyEvent,簡稱coroae插件。要構(gòu)建一個帶 coroae 支持的uWSGI二進(jìn)制文件curl http://uwsgi.it/install | bash -s coroae? /tmp/uwsgi。4個進(jìn)程每個進(jìn)程下100個協(xié)程:uwsgi --http :9090 --wsgi-file? foobar.py --coroae? 100 --processes 4

3. 魯棒性

在生產(chǎn)環(huán)境上高度推薦應(yīng)用總是運(yùn)行master進(jìn)程。它將不斷監(jiān)控你的進(jìn)程/線程,并且會添加有趣的特性,例如 uWSGI Stats服務(wù)器

增加魯棒性啟用master:uwsgi --http? :9090? --wsgi-file foobar.py --processes 3? --threads? 3? --master

多個進(jìn)程fork()問題

當(dāng)你開始學(xué)習(xí)uWSGI的時候,你會面對的其中一個“問題”是它的 fork() 使用。默認(rèn)情況下,uWSGI在第一個生成的進(jìn)程中加載應(yīng)用,然后多次 fork() 自身。這意味著應(yīng)用被單次加載,然后被拷貝。

雖然這個方法加速了服務(wù)器的啟動,但是有些應(yīng)用在這項(xiàng)技術(shù)下會出問題 (特別是那些在啟動時初始化db連接的應(yīng)用,因?yàn)閷谧舆M(jìn)程中繼承連接的文件描述符)。

如果對uWSGI使用的粗暴的preforking不確定,那么只需使用 --lazy-apps 選項(xiàng)來禁用它。它將會強(qiáng)制uWSGI在每個進(jìn)程worker中完全加載你的應(yīng)用一次。

uwsgi在web服務(wù)器中

一般情況下通用的架構(gòu)負(fù)載均衡器/http路由<=協(xié)議=>uwsgi<=協(xié)議=>web服務(wù)器

場景0(不帶負(fù)載均衡/http路由器):uwsgi --socket :9090? --wsgi-file? foobar.py

場景1(uwsgi自帶的http路由方式):uwsgi --http :9090 --wsgi-file foobar.py

場景2(nginx+uwsgi,--socket告知uwsgi使用uwsgi協(xié)議):uwsgi --socket :9090? --wsgi-file? foobar.py

一個常用的nginx配置,nginx傳遞每個請求到9090端口且使用uwsgi協(xié)議的服務(wù)器。

location / {

? ? include uwsgi_params;

? ? uwsgi_pass 127.0.0.1:9090;

}

場景3(http協(xié)議的負(fù)載均衡/路由器+uwsgi +http協(xié)議的web服務(wù)器, --http-socket告知uwsgi使用協(xié)議是http):uwsgi --http-socket :9090? --wsgi-file? foobar.py

場景4(最常見的nginx+uwsgi+django,--socket告知uwsgi使用uwsgi協(xié)議):uwsgi? ? --socket? 127.0.0.1:3031 --chdir? /home/foobar/myproject/ --wsgi-file? myproject/wsgi.py --master --processes 4? ? --threads 2 --stats 127.0.0.1:9191

使用--chdir指定Django工程來正確加載模塊

場景5(nginx+uwsgi+flask,--socket告知uwsgi使用uwsgi協(xié)議):uwsgi --socket? 127.0.0.1:3031 --wsgi-file myflaskapp.py? ? ? --callable app --processes 4 --threads 2

--callable 選項(xiàng),告知uwsgi去web服務(wù)器上找一個叫”app”的函數(shù)。Flask將其WSGI函數(shù) 導(dǎo)出為”app”(在這個快速入門開始的地方我們稱為”application”的函數(shù)),myflaskapp.py

from flask import Flask

app = Flask(__name__)

@app.route('/')

def index():

? ? return "<span style='color:red'>I am app 1</span>"

簡單總結(jié)下

uwsgi意在為托管服務(wù)而開發(fā)全棧。

uwsgi作為http路由器:uWSGI支持各種的語言和平臺。當(dāng)uwsgi接收到一個請求,怎么知道“路由”到哪里?每個uWSGI插件都被分配了一個數(shù)字 (modifier),通過–http-modifier1? 5”路由到psgi插件”。

perl/psgi分配到的是5,ruby/rack的是7。

uwsgi --plugins http,psgi --http :8080 --http-modifier1 5 --psgi myapp.pl

uwsgi支持的協(xié)議:與nginx通信,uWSGI可以使用各種協(xié)議:http, uwsgi, fastcgi, scgi...。最有效的是uwsgi,Nginx默認(rèn)支持uwsgi協(xié)議。

疑問:nginx自身怎么知道使用http還是uwsgi協(xié)議和uwsgi通信呢?

location / {

? ? include uwsgi_params;

? ? uwsgi_pass 127.0.0.1:3031;

? ? uwsgi_modifier1 5;

}

注意:不需要配置uWSGI指定的modifier,nginx將會使用 uwsgi_modifier1 5; 指令。

uWSGI項(xiàng)目是由許多插件注冊的。你可以選擇構(gòu)建服務(wù)器核心,并為每個特性使用一個插件(需要時加載)。

uwsgi選項(xiàng)參數(shù),先暫存一下。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內(nèi)容