FAQ
为什么要使用
完整的网站应用的开发解决方案
进程管理、长时间运行的任务、RPC、集群、负载均衡、监控、资源限制
并发性能
需要注意OS socket backlog queue limit( /proc/sys/net/somaxconn /proc/sys/net/ipv4/tcp_max_syn_backlog)
Harakiri
调整超时时间和监听队列
调整
增加工作进程并不意味着增加性能,应该按照应用来设置
(IO带宽 CPU IO延时)
关于线程,不用线程就别启用
可以禁用多解释器,如果只运行一个应用则可禁用多个解释器 single-interpreter = true
在生产环境中要启用master
uwsgi 协议
集群
uwsgi rpc stack可快速调用远程节点上的函数
uwsgi legion subsystem可选举出多节点中的主节点
最佳实践
如果把uwsgi直接暴露在外,可使用http,如果想在一个服务器之后使用uwsgi,可使用http-socket(http会启动一个额外的进程来将请求分发给工作进程,通过router proxy load-balancer作为护盾,这个护盾还可以独立启动,通过http-to来和sock交流)
Native HTTP support — uWSGI 2.0 documentation (uwsgi-docs.readthedocs.io)
如果是部署多个app 使用emperor
使用uwsgitop 通过uwsgi stats server来监控app
http请求的body应该被读取,如果未读取则影响服务器
可以设置post-buffering选项来让uwsgi来自动读取数据
关于app使用的内存,可以设置memory-report选项
关于权限:如果使用的是unix socket那么需要注意文件的权限;启动uwsgi时默认按root,但可通过uid gid来控制
默认没有GIL,在应用中创建的线程就不会运行 可通过enable-threads来启用
如果设置了threads选项(使用线程模型)会自动启用
在请求中启动一个新的进程会继承父进程的文件标识符,包括连接的socket,设置close-on-exec来禁用该行为
默认的请求头部大小为4096byte,如果收到invalid request block size则需要设置buffer-size为更大的缓冲,最大65535
查看ip_conntrack_max,如果有很多闲置工作进程
strict 严格配置文件
在真实部署时关掉python的code auto reloading
wsgi.file_wrapper如果在返回内存中文件中会出错,可通过wsgi-disable-file-wrapper = true来禁用
vacuum = true 指示uwsgi清除它产生的任意临时文件
need-app = true 没有app则不启动
disable-logging = true禁用了日志记录后可以启用log-4xx = true log-5xx = true来启用异常情况下的日志记录
工作进程回收
max-requests = 1000
max-worker-lifetime = 3600
reload-on-rss = 2048
worker-reload-mercy = 60
额外特性
http相关支持
./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个主进程负责分发请求,4个工作进程来处理
(2)使用了uwsgi socket来分发
[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
可监听多个地址 可分发到多个地址
可查看subscription服务,有更多的配置选择
可通过http-var来向工作进程传递uwsgi变量
可通过http-modifier1向工作进程传递
关于keep alive,应用应当返回正确的HTTP头部,设置有效的content-length或使用http-auto-chunked选项;设置Connection: Keep-Alive或使用add-header = Connection: Keep-Alive选项;http11-socket选项
关于gzip,使用http-auto-gzip选项,如果uWSGI-Encoding头部设置为了gzip,同时Content-Length和Content-Encoding没有设置
https相关支持
uwsgi --master --https 0.0.0.0:8443,foobar.crt,foobar.key
使用一般端口开始https服务
uwsgi --shared-socket 0.0.0.0:443 --uid roberto --gid roberto --https =0,foobar.crt,foobar.key
因443端口需要权限,这里用shared socket并在绑定后切换用户