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

不错的中文文档:http://www.cnblogs.com/zhouej/archive/2012/03/25/2379646.html

挑几个重点:

--wsgi-file , 指定wsgi入口文件

-p  , workers个数,也是进程数, 按照惯例可默认设为核数,但是不是最优配置需要通过 uwsgitop来查看(个人觉得uwsgitop没啥用)。

--threads , 线程数, 每个进程的线程数,进程的任务用线程的模式完成。由于用c编写,因此不用担心GIL的问题, 但linux上不存在线程,线程本质来讲是伪进程(且存在上下文切换成本),因此不建议使用。

(用了后,再用uwsgitop监控时,可通过键盘的“A”键查看线程的资源占用情况)

--listen (-l), 内核监听(listen)网络队列的长度,受文件操作系统最大的网络连接数(net.core.somaxconn) 的限制, 长度越大意味着在高并发的环境下,丢失请求越少。

--cpu-affinity, cpu友好,即进程在运行时不切换核(切换意味着时间成本)

--stats,  监控程序的url,只有设置了这个参数以后才能用 uwsgitop 1717来观看监控

--memory-report, 开启内存占用报告(uwsgitop中可以看到)

--master(-M), 启动主进程,方便管理所有进程, 可以配合--pidfie 使用。方便停止(uwsgi --stop /tmp/uwsgi.pid)/重启uwsgi ( uwsgi --reload /tmp/uwsgi.pid)

--daemonize, 增加守护进程,使web服务更加稳定。参数为日志文件的路径。

--disable-loggin, 不记录请求信息的日志。只记录错误以及uWSGI内部消息到日志中。

其他略,可以自己逐一尝试。

用途

flask必需搭配使用咯。

django建议使用,默认支持,有默认的wsgi.py文件生成。

1. flask

uwsgi -s /tmp/uwsgi.sock --manage-script-name --mount /=xxx_project:app --http 0.0.0.0:9091

xxx_project换为具体的项目文件顶层文件夹。

2. django

django官方介绍

uwsgi --chdir=/path/to/project/site_app  --module=site_app.wsgi:application  --env DJANGO_SETTINGS_MODULE=site_app.settings

uwsgi官方介绍:http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html#test-your-django-project。

uwsgi --http :8000 --module web_app.wsgi

相对来说后者简单粗暴。

进一步的并发提升

+nginx,

为啥呢?看这里:http://www.oschina.net/translate/serving-python-web-applications?lang=eng

即:

I was pretty proud when we got API response times down to 40ms on average. When I say API I’m only talking about the time it takes from it hitting the Python server, to the server returning it’s response to the proxy.
Unfortunately, it quickly became apparent that there were capacity issues when we started getting more traffic for larger spikes. We’d hit bumpy response times that were no longer consistent, but we still had about 30% memory and 60% cpu to spare on the web nodes.

即:实测发现,uwsgi似乎不能充分的利用cpu和内存来达到无上限的并发。有一定瓶颈,并且到达瓶颈后,cpu和内存还剩下很多!

那为了充分利用资源不妨多开几个uwsgi服务咯。

老外实测发现: 与其让一个uwsgi服务跑10个进程,不如开10个uwsgi服务,然后用nginx做负载均衡!

After quite a few tweaks, what we eventually settled on was managing a larger amount of uwsgi processes, and letting nginx load balance them (vs letting uwsgi itself load balance).

What this means, is that instead of doing uwsgi –processes=10, we ran 10 separate uwsgi processes.

The result was a beautiful, consistent 20ms average response time.

当然这个有待验证。

简单说,就是uwsgi本身的负载均衡没有nginx牛逼。所以阉割掉不用。

因此uwsgi退化成了wsgi服务器。

nginx 咋配置,略。

转载请注明来自:http://www.cnblogs.com/Tommy-Yu/p/5647730.html,谢谢!

使用uwsgi 部署python web服务的更多相关文章

  1. nginx+uwsgi部署python web(web.py)

    1.nginx: nginx 是一个 http 服务器,与 apache.lighttpd.Microsoft IIS 等属于同类产品. 2.uWSGI: uWSGI 是一个快速的.纯C语言开发的.自 ...

  2. nginx上部署python web

    nginx上部署python web http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html

  3. 戏说WSGI(Python Web服务网关接口)--[转载]

    戏说WSGI(Python Web服务网关接口) 当你在Python的世界中冒险,突然遭遇一只Web怪兽,你会选择什么武器对付它?在兵器谱上,下列兵器可谓名列前茅: Zope,厚重的长枪.较早出现的武 ...

  4. Python Web 服务开发者: 第 1 部分

    Python Web 服务开发者: 第 1 部分 Python Web 服务世界 Python 的座右铭一向是“装备齐全”,这是指在安装该语言时会附带一大套标准库和功能程序.本文概述了在 Python ...

  5. 踩坑踩坑之Flask+ uWSGI + Tensorflow的Web服务部署

    一.简介 作为算法开发人员,在算法模块完成后,拟部署Web服务以对外提供服务,从而将算法模型落地应用.本文针对首次基于Flask + uWSGI + Tensorflow + Nginx部署Web服务 ...

  6. 使用Nginx+Uwsgi部署Python Flask项目

    第一次用Flask做Web(也是第一次用Python做Web),在部署的时候遇到了不少问题,现在将过程就下来,供在这方面也有疑惑的人参考.(PS:使用Apache+mod_wsgi部署模式的可以参考另 ...

  7. 【JVM】linux上tomcat中部署的web服务,时好时坏,莫名其妙宕机,报错:There is insufficient memory for the Java Runtime Environment to continue.

    =========================================================================================== 环境: linu ...

  8. supervisor+gunicorn部署python web项目

    有了Nginx,对于Tomcat没有必要详细了解. 有了supervisor,再也没有必要把一个程序设置成服务.驻留进程,supervisor真是一个相见恨晚的好工具. 在Tomcat中,所有的web ...

  9. Nginx与python web服务配置(Uwsgi& FastCGI)

    Uwsgi start uswgi uwsgi --harakiri 360000 --body-read-warning=10000 --max-fd=65536 -b 1000000 --http ...

随机推荐

  1. LoadScript

    function loadScripts(urls, callback) { if (typeof (urls) === "string"){ urls = [urls]; } v ...

  2. Python开发【第六篇】:模块

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  3. 后缀.jar的是什么文件?

    解压kafka 打开后是一堆.jar结尾的文件,那么后缀.jar的是什么文件? JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种 ...

  4. asp.net core csrf

    如果用tag 比如 <form asp-action="Login" asp-controller="Account" method="post ...

  5. [译]ES6箭头函数和它的作用域

    原文来自我的前端博客: http://www.hacke2.cn/arrow-functions-and-their-scope/ 在ES6很多很棒的新特性中, 箭头函数 (或者大箭头函数)就是其中值 ...

  6. SQL如何将A,B,C替换为'A','B','C'

    因为涉及到逗号,和单引号' 本来想一次转换成功, 但是最后貌似没有好的办法, 只有分两次完成了 select REPLACE(REPLACE('A,B,C',',','>,>'),'> ...

  7. hdu1757 A Simple Math Problem

    Problem Description Lele now is thinking about a simple function f(x).If x < 10 f(x) = x.If x > ...

  8. 湖南附中模拟day1 收银员

    4.1 题意描述花花家的超市是 24 小时营业的,现在需要招聘收银员.超市每个小时都需要不同数量的收银员,用 ai 表示一天中 i 点到 i + 1 点这一小时内需要的收银员数量,特别地 a23 表示 ...

  9. linux下系统对于sigsegv错误时的处理

    一般来讲,对非法地址的访问会导致应用程序收到由系统发送的sigsegv信号,默认情况下,函数对于这个信号的处理是退出. 但是为了方便调试,我们可以自己设置处理函数,使用signal函数. 这里比较重要 ...

  10. 移除wordpress留言中自动链接功能

    默认情况下,在 WordPress 博客的留言中含有 URL,会自动变成可点击的,虽然这样的链接是 nofollow 的,但是还是成为 SPAM 利用的对象,所以可以移除这个自动链接功能. 我们可以在 ...