9种python web 程序的部署方式小结


Posted in Python onJune 30, 2014

主流的web server 一个巴掌就能数出来,apache,lighttpd,nginx,iis

application,中文名叫做应用服务,就是你基于某个web framework写的应用代码DB server 泛指存储服务,web开发中用mysql比较多,最近几年因为网站规模扩大,memcache,redis这种key-value等存储也流行开来
放在最前面的 web server 有3个功能

高效率处理静态文件 ,web server都是用c开发,调用是native的函数,对IO,文件传输都做针对性的优化

充当一个简易的网络防火墙 ,可以denny一些ip,简单的控制并发连接数量等等,聊胜于无

处理高并发短连接请求 ,把成千上万用户的request 通过内网的几十个长连接进行转发,原因一个是web server处理高并发很专业,另外一个原因是大部分的application所用的框架都不具备处理高并发的能力

实际上,市面上有部分web framework由于内置了支持epoll/kqueue 等高效网络库,而具备了处理高并发的能力,比如说 python的tornado,java系的tomcat,jetty等等,有人就去掉前端的web server,直接裸奔,但是在部署公网应用时候,最好别这样做,因为前面提到的1,2两个原因,用户brower到web server的网络状况是千奇百怪,你无法想象的,

web server 强烈建议使用nginx,原因有三

性能非常卓越,非常稳定
安装简单,依赖包少
conf文件非常容易配置,比apache/lighttpd都要简单
部署python开发的web程序有9种方法

mod_python ,这是apache内置的模块,很严重的依赖于mod_python编译使用的python版本,和apache配套使用,不推荐

cgi ,这个太old,不推荐,而且nginx不支持cgi方式,只能用lighttpd或者apache

fastcgi  ,这个是目前流行最广的做法,通过flup模块来支持的,在nginx里对应的配置指令是 fastcgi_pass

spawn-fcgi ,这个是fastcgi多进程管理程序,lighttpd安装包附带的,和 flup效果一样,区别是flup是 python代码级引入,spawn-fcgi是外部程序。spawn-fcgi用途很广,可以支持任意语言开发的代码,php,python,perl,只要你代码实现了fastcgi接口,它都可以帮你管理你的进程

scgi ,全名是Simple Common Gateway Interface,也是cgi的替代版本, scgi协议 很简单,我觉得和fastcgi差不多,只是没有怎么推广开来,nginx对应的配置指令是scgi_pass,你想用就用,flup也支持。

http ,nginx使用proxy_pass转发,这个要求后端appplication必须内置一个能处理高并发的http server,在python的web框架当中,只能选择tornado.

python程序员喜欢发明轮子,tornado除了是一个web framework之外,它还可以单独提供高性能http server,所以,如果你采用其他python框架写代码,比如说bottle,也一样可以通过import tornado 来启动一个高性能的http server,同样的可以采用http协议和nginx一起来部署。扩展开来,python包里面能处理高并发的http server还有很多,比如说gevent,也可以被其他框架引用来支持http方式部署。

现实当中,用java来做web程序,通常就用http和nginx配合,应用服务器选择tomcat或者jetty

uwsgi ,包括4部分组成,

uwsgi协议
web server内置支持协议模块
application服务器协议支持模块
进程控制程序

nginx从0.8.4开始内置支持uwsgi协议,uwsgi协议非常简单,一个4个字节header+一个body,body可以是很多协议的包,比如说http,cgi等(通过header里面字段标示),我曾经做个一个小规模的性能对比测试,结果表明,uwsgi和fastcgi相比,性能没有太明显的优势,也可能是数据集较小的原因

uwsgi的特点在于自带的进程控制程序.它是用c语言编写,使用natvie函数,其实和spawn-fcgi/php-fpm类似。所以uwsgi可以支持多种应用框架,包括(python,lua,ruby,erlang,go)等等

Gunicorn ,和uwsgi类似的工具,从rails的部署工具(Unicorn)移植过来的。但是它使用的协议是 WSGI,全称是Python Web Server Gateway Interface ,这是python2.5时定义的官方标准( PEP 333  ),根红苗正,而且部署比较简单, http://gunicorn.org/  上有详细教程

mod_wsgi ,apache的一个module,也是支持WSGI协议, https://code.google.com/p/modwsgi/

fastcgi协议和http协议在代码部署中的的优劣对比

fastcgi虽然是二进制协议,相对于http协议,并不节省资源。二进制协议,只能节省数字的表达,比如 1234567,用字符串表示需要7个Byte,用数字就是4个Byte,而字符串到哪里都一样

fastcgi在传输数据的时候,为了兼容cgi协议,还要带上一堆cgi的环境变量,所以和http协议相比,用fastcgi传输数据并不省,反而多一些

fastcgi 唯一的优点是,它是长连接的,用户并发1000个request,fastcgi可能就用10个 链接转发给后端的appplication,如果用http协议,那来多少给多少,会向后端appplication 发起1000个请求

http代理转发方式,在面对超高并发的情况下会出问题,因为, tcp协议栈当中,port是int16整型  你本地新建一个connect,需要消耗一个端口,最多能到65536。外部并发几十万个请求,port池耗干,你的服务器只能拒绝响应了

总结

我个人习惯是用 fastcgi 协议部署python程序,简单省事,选择技术方案,一定要选择最简单最常见的,本博客的fastcgi运行脚本如下

kill - `cat / tmp / django.pid`
echo 'restart django....' 
python . / manage.py runfcgi - - settings = lutaf.settings_r maxchildren =  maxspare = minspare =  method = prefork pidfile = / tmp / django.pid host = 127.0 . 0.1  port = outlog = / tmp / dj.out errlog = / tmp / dj.error

推荐大家尝试 Gunicorn ,这是未来发展方向

Python 相关文章推荐
Python图像灰度变换及图像数组操作
Jan 27 Python
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
May 28 Python
详解Python实现按任意键继续/退出的功能
Aug 19 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
Django 配置多站点多域名的实现步骤
May 17 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
Dec 19 Python
Python 模拟动态产生字母验证码图片功能
Dec 24 Python
查看keras的默认backend实现方式
Jun 19 Python
Python学习笔记之装饰器
Aug 06 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 Python
详解如何使用Pytest进行自动化测试
Jan 14 Python
一文搞懂python异常处理、模块与包
Jun 26 Python
Python开发WebService系列教程之REST,web.py,eurasia,Django
Jun 30 #Python
windows下wxPython开发环境安装与配置方法
Jun 28 #Python
Python使用稀疏矩阵节省内存实例
Jun 27 #Python
Python实现的百度站长自动URL提交小工具
Jun 27 #Python
python使用心得之获得github代码库列表
Jun 25 #Python
在Python中使用异步Socket编程性能测试
Jun 25 #Python
Python开发的单词频率统计工具wordsworth使用方法
Jun 25 #Python
You might like
php file_get_contents函数轻松采集html数据
2010/04/22 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
php自定义函数实现二维数组按指定key排序的方法
2016/09/29 PHP
PHP sdk文档处理常用代码示例解析
2020/12/09 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
2013/06/19 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
jQuery移除tr无效的解决方法(tr是动态添加)
2014/09/22 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
jQuery实现的模拟弹出窗口功能示例
2016/11/24 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
使用Bootstrap打造特色进度条效果
2017/05/02 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
Python中的exec、eval使用实例
2014/09/23 Python
Python数组遍历的简单实现方法小结
2016/04/27 Python
python多进程中的内存复制(实例讲解)
2018/01/05 Python
python实现求最长回文子串长度
2018/01/22 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
python利用proxybroker构建爬虫免费IP代理池的实现
2021/02/21 Python
html5 的a标签 Href 拨电话的写法
2013/11/04 HTML / CSS
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
ET Mall东森购物网:东森严选
2017/03/06 全球购物
法国房车租赁网站:Yescapa
2019/08/26 全球购物
加拿大专业美发产品购物网站:Chatters
2021/02/28 全球购物
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
如何提高MySql的安全性
2014/06/19 面试题
大学学习生活感言
2014/01/18 职场文书
《莫高窟》教学反思
2014/02/25 职场文书
外贸员简历中的自我评价
2014/03/04 职场文书
酒店端午节活动方案
2014/08/26 职场文书
2015年毕业生实习评语
2015/03/25 职场文书
2015年化验员工作总结
2015/04/10 职场文书
Python字符串常规操作小结
2022/04/03 Python
Python+DeOldify实现老照片上色功能
2022/06/21 Python