uwsgi, wsgi协议的一个很好的实现,源码在这里:https://github.com/unbit/uwsgi
c语言编写,有兴趣可以研究下。
上DEMO:
wsgi_server.py
def application(env, start_response): start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)]) return ‘hello world‘
应用:
使用uwsgi部署以上应用:
uwsgi --http 0.0.0.0:9090 -p 4 -l 100 -M -R 100000 -z30 -L --wsgi-file wsgi_server.py --max-apps 65535 --stats 127.0.0.1:1717 --post-buffering 100M --cpu-affinity --buffer-size 65535 --daemonize /tmp/uwsgi --pidfile /tmp/uwsgi.pid --memory-report --threads 4
然后浏览器访问: http://localhost:9090/ 即可。
优势:
提高并发访问支持(-p 进程数, --threads 线程数)
提高服务运行稳定性(--daemonize)
安装
pip install uwsgi pip install uwsgitop
uwsgi--uwsgi服务器
uwsgitop--uwsgi服务器性能查看工具,用法:
配合以上例子
uwsgitop 127.0.0.1:1717
参数详细说明
官方文档:http://uwsgi-docs.readthedocs.io/en/latest/Options.html
挑几个重点:
--wsgi-file , 指定wsgi入口文件
-p , workers个数,也是进程数, 按照惯例可默认设为核数,但是不是最有需要通过 uwsgitop来查看(个人觉得uwsgitop没啥用)。
--threads , 线程数, 每个进程的线程数,进程的任务用线程的模式完成。由于用c编写,因此不用担心GIL的问题, 但linux上不存在线程,线程本质来讲是伪进程(且存在上下文切换成本),因此不建议使用。
(用了后,再用uwsgitop监控时,可通过键盘的“A”键查看线程的资源占用情况)
--listen , 内核监听(listen)网络队列的长度,受文件操作系统最大的网络连接数(net.core.somaxconn) 的限制, 长度越大意味着在高并发的环境下,丢失请求越少。
--cpu-affinity, cpu友好,即进程在运行时不切换核(切换以为者时间成本)
--stats, 监控程序的url,只有设置了这个参数以后才能用 uwsgitop 1717来观看监控
--memory-report, 开启内存占用报告(uwsgitop中可以看到)
--master, 启动主进程,方便管理所有进程, 可以配合 pidfie 使用。方便停止(uwsgi --stop /tmp/uwsgi.pid)/重启uwsgi ( uwsgi --reload /tmp/uwsgi.pid)
--daemonize, 增加守护进程,使web服务更加稳定。参数为日志文件的路径。
其他略,可以自己逐一尝试。
用途
flask必需搭配使用咯。
django建议使用,默认支持,有默认的wsgi.py文件生成。