FAQ
為什么要使用
完整的網(wǎng)站應(yīng)用的開(kāi)發(fā)解決方案
進(jìn)程管理、長(zhǎng)時(shí)間運(yùn)行的任務(wù)、RPC、集群、負(fù)載均衡、監(jiān)控、資源限制
并發(fā)性能
需要注意OS socket backlog queue limit( /proc/sys/net/somaxconn /proc/sys/net/ipv4/tcp_max_syn_backlog)
Harakiri
調(diào)整超時(shí)時(shí)間和監(jiān)聽(tīng)隊(duì)列
調(diào)整
增加工作進(jìn)程并不意味著增加性能,應(yīng)該按照應(yīng)用來(lái)設(shè)置
(IO帶寬 CPU IO延時(shí))
關(guān)于線程,不用線程就別啟用
可以禁用多解釋器,如果只運(yùn)行一個(gè)應(yīng)用則可禁用多個(gè)解釋器 single-interpreter = true
在生產(chǎn)環(huán)境中要啟用master
uwsgi 協(xié)議
集群
uwsgi rpc stack可快速調(diào)用遠(yuǎn)程節(jié)點(diǎn)上的函數(shù)
uwsgi legion subsystem可選舉出多節(jié)點(diǎn)中的主節(jié)點(diǎn)
最佳實(shí)踐
如果把uwsgi直接暴露在外,可使用http,如果想在一個(gè)服務(wù)器之后使用uwsgi,可使用http-socket(http會(huì)啟動(dòng)一個(gè)額外的進(jìn)程來(lái)將請(qǐng)求分發(fā)給工作進(jìn)程,通過(guò)router proxy load-balancer作為護(hù)盾,這個(gè)護(hù)盾還可以獨(dú)立啟動(dòng),通過(guò)http-to來(lái)和sock交流)
Native HTTP support — uWSGI 2.0 documentation (uwsgi-docs.readthedocs.io)
如果是部署多個(gè)app 使用emperor
使用uwsgitop 通過(guò)uwsgi stats server來(lái)監(jiān)控app
http請(qǐng)求的body應(yīng)該被讀取,如果未讀取則影響服務(wù)器
可以設(shè)置post-buffering選項(xiàng)來(lái)讓uwsgi來(lái)自動(dòng)讀取數(shù)據(jù)
關(guān)于app使用的內(nèi)存,可以設(shè)置memory-report選項(xiàng)
關(guān)于權(quán)限:如果使用的是unix socket那么需要注意文件的權(quán)限;啟動(dòng)uwsgi時(shí)默認(rèn)按root,但可通過(guò)uid gid來(lái)控制
默認(rèn)沒(méi)有GIL,在應(yīng)用中創(chuàng)建的線程就不會(huì)運(yùn)行 可通過(guò)enable-threads來(lái)啟用
如果設(shè)置了threads選項(xiàng)(使用線程模型)會(huì)自動(dòng)啟用
在請(qǐng)求中啟動(dòng)一個(gè)新的進(jìn)程會(huì)繼承父進(jìn)程的文件標(biāo)識(shí)符,包括連接的socket,設(shè)置close-on-exec來(lái)禁用該行為
默認(rèn)的請(qǐng)求頭部大小為4096byte,如果收到invalid request block size則需要設(shè)置buffer-size為更大的緩沖,最大65535
查看ip_conntrack_max,如果有很多閑置工作進(jìn)程
strict 嚴(yán)格配置文件
在真實(shí)部署時(shí)關(guān)掉python的code auto reloading
wsgi.file_wrapper如果在返回內(nèi)存中文件中會(huì)出錯(cuò),可通過(guò)wsgi-disable-file-wrapper = true來(lái)禁用
vacuum = true 指示uwsgi清除它產(chǎn)生的任意臨時(shí)文件
need-app = true 沒(méi)有app則不啟動(dòng)
disable-logging = true禁用了日志記錄后可以啟用log-4xx = true log-5xx = true來(lái)啟用異常情況下的日志記錄
工作進(jìn)程回收
max-requests = 1000
max-worker-lifetime = 3600
reload-on-rss = 2048
worker-reload-mercy = 60
額外特性
http相關(guān)支持
./uwsgi --http 127.0.0.1:8080 --master --module mywsgiapp --processes 4
./uwsgi --master --http 127.0.0.1:8080 --http-to /tmp/uwsgi.sock
(1)使用了1個(gè)主進(jìn)程負(fù)責(zé)分發(fā)請(qǐng)求,4個(gè)工作進(jìn)程來(lái)處理
(2)使用了uwsgi socket來(lái)分發(fā)
[uwsgi]
http = 0.0.0.0:8080
http = 192.168.173.17:8181
master = true
http-to = /tmp/uwsgi.sock
http-to = 192.168.173.1:3031
http-to = 192.168.173.2:3031
可監(jiān)聽(tīng)多個(gè)地址 可分發(fā)到多個(gè)地址
可查看subscription服務(wù),有更多的配置選擇
可通過(guò)http-var來(lái)向工作進(jìn)程傳遞uwsgi變量
可通過(guò)http-modifier1向工作進(jìn)程傳遞
關(guān)于keep alive,應(yīng)用應(yīng)當(dāng)返回正確的HTTP頭部,設(shè)置有效的content-length或使用http-auto-chunked選項(xiàng);設(shè)置Connection: Keep-Alive或使用add-header = Connection: Keep-Alive選項(xiàng);http11-socket選項(xiàng)
關(guān)于gzip,使用http-auto-gzip選項(xiàng),如果uWSGI-Encoding頭部設(shè)置為了gzip,同時(shí)Content-Length和Content-Encoding沒(méi)有設(shè)置
https相關(guān)支持
uwsgi --master --https 0.0.0.0:8443,foobar.crt,foobar.key
使用一般端口開(kāi)始https服務(wù)
uwsgi --shared-socket 0.0.0.0:443 --uid roberto --gid roberto --https =0,foobar.crt,foobar.key
因443端口需要權(quán)限,這里用shared socket并在綁定后切換用戶