uwsgi配置理解
最近使用uwsgi 部署了flask應(yīng)用,出現(xiàn)了不少問題,仔細(xì)查閱了一下資料以及翻看了官方文檔,就對自己了解到的做個總結(jié)~~
一、http/http-socket/socket
uwsgi開頭當(dāng)然少不了通信的接口。
有3種方式:
socket=127.0.0.1:8888
http=0.0.0.0:8888
http-socket=127.0.0.1:8888
?三個方式看起來十分的相似,閱讀了很多博客和官方文檔,下面是自己的一些理解(可能不完全正確)!
?
?
?
?
圖一是socket方式,現(xiàn)在大部分web服務(wù)器(如nginx)支持uwsgi,?這是這三種方式最高效的一種形式,socket通信速度會比http快
圖二是http-socket方式,這個適用于web服務(wù)器不支持uwsgi時。
后面2個圖都是http方式,使用http啟動uwsgi,系統(tǒng)會額外啟動一個http進(jìn)程,從級別上來說,它和nginx是同一級別的,所以客戶端和uwsgi通信,完全可以繞過nginx,不需要額外進(jìn)行一個轉(zhuǎn)發(fā)(如圖三一樣),但很顯然,這是并不是一個很明智但選擇,這樣會失去了nginx很多優(yōu)秀的功能。
官方推薦的方式為socket以及http-socket方式,顯然使用http方式會額外產(chǎn)生一個http進(jìn)程,如果還通過nginx轉(zhuǎn)發(fā),那么效率上來說是相對比較低的。
二、processes/workers.
? ? ? ?表示開啟多進(jìn)程,根據(jù)你的應(yīng)有開啟合適的進(jìn)程數(shù),在一些參考資料上,可能會看到processes?=?2?*?cpucores或者workers = 2?*?cpucores,如果應(yīng)有比較簡單,這樣設(shè)置一般可以。如果想更合理,官方提供了uwsgitop去獲得一個較為合理的值。
三、threads & enable-threads
? ? ? ? python中存在GIL,實際上不存在真正意義上的多線程,但是否需要,這個就根據(jù)各自但需求設(shè)定了。結(jié)合processes:
processes=2
threads=4
表示2個進(jìn)程,每個進(jìn)程中有4個線程。
? ? ? ?由于GIL的存在,uwsgi索性默認(rèn)不支持多線程,不對GIL進(jìn)行初始化。但如果希望程序中的線程發(fā)揮作用,需要加入enable-threads=True;
? ? ? 但如果已經(jīng)在多線程模式(使用?threads?選項)下,那么uWSGI將會自動啟用線程支持。
四、uid & gid & chmod-socket
? ? ? ?uwsgi不建議使用root權(quán)限去啟動uwsgi實例。可以通過root用戶去運行uwsgi文件,當(dāng)通過uid和gid去修改用戶(移除root權(quán)限)。并且,如果你使用的是socket的通信方式,最好加上chmod-socket字段,在linux下,socket的啟動方式,套接字類似文件,你必須保證有權(quán)限去讀取它。
chmod-socket=660
uid=1000
gid=1000
五、master
? ? ? ?意味著啟動一個master主進(jìn)程來管理其他進(jìn)程,建議啟動這個進(jìn)程,在管理的時候比較方便;如果kill這個master進(jìn)程,相當(dāng)于關(guān)閉所有的uwsgi進(jìn)程。
六、其他
? ? ? ? chdir: 工程目錄(啟動文件所在位置)。?
? ? ? ? module: 應(yīng)有程序文件(這個字段與wsgi-file相似?)
? ? ? callable:flask應(yīng)用實例的名稱,是flask獨有的配置項(django不需要)。由于flask存在特殊的機(jī)制,可以實例化多個application,需要明確指出,收到請求時,uwsgi應(yīng)該調(diào)用哪個應(yīng)用實例。
? ? ? ?buffer-size: 設(shè)置用于uwsgi包解析的內(nèi)部緩存區(qū)大小,默認(rèn)是4k。如果你允許接受較大數(shù)據(jù)的報頭,這個值可以設(shè)置到64k,如果出現(xiàn)報頭過大的錯誤,可以通過設(shè)置這個值解決。
? ? ? ?daemonize: 日志輸出文件。
? ? ? ?disable-logging: 不記錄正常的請求日志,只記錄錯誤日志。
七、lazy-app
? ? ? ?這個字段有著特殊的作用,目前還在測試與使用,接下來再把發(fā)現(xiàn)的問題更新進(jìn)來。
下面是是我flask項目的完整uwsgi文件:
socket=127.0.0.1:9088
#http-socket=127.0.0.1:8888
#http=127.0.0.1:8888
processes=2
threads=4
enable-threads=true
lazy-apps=true
uid=1000
gid=1000
chmod-socket=660
master=true
chdir=/data/myapp/
module=manage
callable=app
buffer-size=65536
daemonize=/data/log/uwsgi/app.log
轉(zhuǎn)載于:https://www.cnblogs.com/ExMan/p/10403916.html
總結(jié)
- 上一篇: mui框架提供的相关api
- 下一篇: Spring的事务管理1