python uwsgi 部署以及优化
这篇文章其实两个月之前就应该面世了,但是最近琐事、烦心事太多就一直懒得动笔,拖到现在才写
一、uwsgi、wsgi、fastcgi区别和联系
参见之前的文章 http://www.cnblogs.com/sky20081816/p/3309925.html
二、uwsgi的安装
建议用pip 或者easy_install安装,这样避免了很多的麻烦,我是直接用 pip install uwsgi来安装的。如果你想要用源码安装的话到官网http://projects.unbit.it/uwsgi/ 下载安装
今天遇到在centos6.4下用pip安装失败的情况,结果发现由于centos6.4的python版本还是2.6.6导致。因此centos6.4要升级python版本到2.7才行 (2013-11-25补充)
三、demo演示
demo1 : 最简单的

demo2 :http参数获取的

四、调试
1、自己做webserver
uwsgi --http :9090 --wsgi-file {you process file},这样就启动了,你可以 curl localhost:9090来测试它了
2、前端用nginx代理
uwsgi --socket 127.0.0.1:9090 --wsgi-file {you process file}
这个时候nginx的配置如下
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9090;
}
然后就可以通过nginx制定的域名访问代码
五、参数优化
首先参考下官网的 things to know : http://uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html
我这边最终启动的命令如下:
uwsgi --socket 127.0.0.1:9090 -p 16 -l 8192 -M -R 100000 -z30 -L --wsgi-file app.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 16
1、-p
启动16个进程,注意这里不是16核就启动16个进程,要根据代码实际运行情况来定夺 (There is no magic rule for setting the number of processes or threads to use. It is very much application and system dependent. Simple math like processes = 2 * cpucores will not be enough. You need to experiment with various setups and be prepared constantly monitor your apps. uwsgitop could be a great tool to find the best values.)
这里已经告诉你了,通过uwsgitop来判断,至于如何用uwsgitop,下面我会讲到
2、-l
linux内核监听网络队列长度,这个稍微大一点
3、-M
master模式,启动主进程
4、-R
--max-requests的简写, reload workers after the specified amount of managed requests。一个worker完成多少个请求以后就重启
5、-z
--socket-timeout的缩写 set internal sockets timeout
6、-L
--disable-logging的缩写 disable request logging,禁掉请求的系统日志,调试模式下要打开,生产环境注意关闭,这个东西很影响效率
7、--wsgi-file
程序入口
8、--max-apps
set the maximum number of per-worker applications,这个没啥特别大的意义,可不要
9、--stats 127.0.0.1:1717
监控程序的url,只有设置了这个参数以后才能用 uwsgitop 1717来观看监控,类似于linux的top命令,后面会专门提到
10 --post-buffering
enable post buffering,if an HTTP request has a body (like a POST request generated by a form), you have to read (consume) it in your application. If you do not do this, the communication socket with your webserver may be clobbered. If you are lazy you can use the post-buffering option that will automatically read data for you. For Rack applications this is automatically enabled.
11、--cpu affinity
cpu亲和,也就是一个进程尽量不要切换cpu,因为切换cpu会消耗,但是实际测试过程中这个参数影响不大
12、--buffer-size
set internal buffer size
13、--daemonize
以守护的形式运行uwsgi,运行的日志会保存在/tmp/uwsgi里面,记得启动以后vim /tmp/uwsgi来看下是否有错误日志
14、--pidfile
uwsgi程序的进程id所保存的文件,当我想要关闭uwsgi的时候只需要 uwsgi --stop /tmp/uwsgi.pid即可,还有重启uwsgi --reload /tmp/uwsgi.pid
15、 --memory-report
开启内存报告,在uwsgitop命令下可以看到内存使用情况
16、--threads
开启的线程数,要根据uwsgitop的监控情况来具体调整
六、监控
uwsgi提供了一个很nice的监控工具,uwsgitop。它的安装也很简单 pip install uwsgitop,安装以后 它会存在于 /usr/local/python27/bin/uwsgitop
运行 /usr/local/python27/bin/uwsgitop :1717,出现下面的图片

然后查看下cpu的使用率,内存使用了,STATUS有几个是busy状态的,再具体判断使用几个进程,几个进程
七、压测
之前我压力测过,图片不见了我就懒得上传了
如果仅仅是demo1上的最简单的功能,qps能够达到4W+,当时我都惊呆了,但是后来涉及到复杂的逻辑,还有连接数据库等情况下,它的效率跟nginx +php差不太多
八、总结
python做webserver我不是很推荐,因为python的数据结构限制的比较死,我就碰到过几次编码啊、json格式啊、unicode等问题。而且不同的python版本对于函数的支持也不一样,比如说md5.
但是它也有好处就是如果用uwsgi的话部署很方便。
有利有弊吧,我总觉得python还是做一些大数据啊、统计分析啊、复杂运算啊比较给力,如果是做webserver还是php给力。
python uwsgi 部署以及优化的更多相关文章
- 将树莓派变成一个web服务器(2):Nginx+Flask+uWSGI部署全过程
1)安装Flask,uwsgi,nginx sudo apt-get update sudo apt-get install python-flask #Flask sudo apt-get inst ...
- 使用uwsgi 部署python web服务
uwsgi, wsgi协议的一个很好的实现,源码在这里:https://github.com/unbit/uwsgi c语言编写,有兴趣可以研究下. 上DEMO: wsgi_server.py def ...
- Python Web 程序使用 uWSGI 部署
Python Web 程序使用 uWSGI 部署 WSGI是什么? WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway ...
- Nginx+Python+uwsgi+Django的web开发环境安装及配置
Nginx+Python+uwsgi+Django的web开发环境安装及配置 nginx安装 nginx的安装这里就略过了... python安装 通常系统已经自带了,这里也略过 uwsgi安装 官网 ...
- python应用部署--flask
首先必须吐槽一下,python应用部署简直就是有毒...太麻烦了.关键还不能成功部署. 网上很多教程都是说要用nginx和uwsgi.来来回回试了无数次都不行.于是乎,在某一个瞬间,灵感以来,发现了一 ...
- 填坑!!!virtualenv 中 nginx + uwsgi 部署 django
一.为什么会有这篇文章 第一次接触 uwsgi 和 nginx ,这个环境搭建,踩了太多坑,现在记录下来,让后来者少走弯路. 本来在 Ubuntu14.04 上 搭建好了环境,然后到 centos7. ...
- Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统
Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统 这个是写好的Django程序在本地机运行的情况,一个查询接口. 准备工作 1.首先购买一台阿里云的EC ...
- uwsgi部署web,error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
使用的是miniconda2安装的python,并且加入了环境变量,可是uwsgi部署web时候仍然报错error while loading shared libraries: libpython2 ...
- 使用Nginx+uWSGI部署Django项目
1.linux安装python3环境 参考链接:https://www.cnblogs.com/zzqit/p/10087680.html 2.安装uwsgi pip3 install uwsgi l ...
随机推荐
- 解析Linux特殊文件【转】
您有Dos和Windows经验,就大概知道系统存在若干类型的文件,如系统文件.只读文件.隐含文件等.在Linux下用ls –l 命令来判断文件类型,可以依据第一列中的10个字符来判断.-rw-r—r— ...
- !HDU 1078 FatMouse and Cheese-dp-(记忆化搜索)
题意:有一个n*n的格子.每一个格子里有不同数量的食物,老鼠从(0,0)開始走.每次下一步仅仅能走到比当前格子食物多的格子.有水平和垂直四个方向,每一步最多走k格,求老鼠能吃到的最多的食物. 分析: ...
- word2016打开2007文档出错
不知从何时起,我电脑上的一部分office文件打开时频频报错!!! 有一段时间发现,通过iis发布的网站上下载excel文件的时候,通过localhost下载的文件能够正常打开,但是通过IP和端口下载 ...
- 浅谈CSRF攻击方式(转)
引自:http://www.cnblogs.com/hyddd/一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one cli ...
- c#中abstract、override、new、virtual、sealed使用
abstract 修饰类名为抽象类,修饰方法为抽象方法.如果一个类为抽象类,则这个类智能是其他某个类的基类.抽象方法在抽象类中没有函数体.抽象类中的抽象方法是没有方法体的,继承其的子类必须实现 ...
- MySQL之desc查看表结构的详细信息
在mysql中如果想要查看表的定义的话:有如下方式可供选择 1.show create table 语句: show create table table_name; 2.desc table_nam ...
- django学习笔记【003】创建第一个带有model的app
[1]python应用程序要连接mysql有多个驱动程序可供选择: 1.MySQLdb 这个只支持python2.x 所以在这里就不说了: 2.mysqlclient 下载地址 https://pyp ...
- 用 php 实现一个视图组件和模板引擎——基础
只要不是做后端接口开发和一些作为守护进程之类的服务器脚本,大多数时候都是在和浏览器打交道,因此合理组织并展现 html 标签是最为常见的工作.一般大家使用框架时,都会自带有一套视图组件和模板引擎. 我 ...
- JavaNIO - AbstractInterruptibleChannel
1. 描述 可异步关闭和中断的Channel. (1)实现InterruptibleChannel接口的Channel支持异步关闭:如果一个线程IO阻塞在一个可中断的channel,另一个线程可以执行 ...
- [svc][jk]监控jvm的一个坑
监控jvm的一个坑 1,遇到的问题 我按照以往文档,在catalina.sh里追加jvm的监控api,如下 紧接着我启动 tomcat. 未报任何错误. 发现 lsof –i:12000, 12000 ...