部署WSGI应用程序.有很多方法可以给这只猫上皮.我目前正在使用mod-wsgi的apache2,但我可以看到一些潜在的问题.
那怎么办呢?
Apache Mod-wsgi(其他mod-wsgi似乎不值得)
纯Python Web服务器,例如paste,cherrypy,Spawning,Twisted.web
as 2但是使用来自nginx,apache2等的反向代理,具有良好的静态文件处理能力
转换为其他协议,例如带有网桥(例如Flup)的FCGI,并在传统的Web服务器中运行.
更多?
我想知道你是怎么做的,以及为什么这是最好的方法.我绝对会爱你,向我提供有关最新情况和具体应用的详细信息等等.我会赞成任何非疯狂的答案.
一如既往:取决于;-)
当我不需要任何apache功能时,我会使用纯粹的python网络服务器,如粘贴等.我认为哪一个完全取决于你的应用程序,可以通过做一些基准来决定.我一直想做一些但从未接受过.我想Spawning在使用非阻塞IO开箱即可能有一些优势,但我有时会遇到问题,因为它正在修补它.
当然,你总是可以在前面放一块清漆.
如果需要Apache,我通常会使用解决方案3,这样我就可以将进程分开.您还可以更轻松地将流程移动到其他服务器等.我只想将事物分开.
对于静态文件,我现在正在使用一个单独的服务器,用于一个只提供静态图像/ css/js的项目.我使用lighttpd作为网络服务器,具有很好的性能(在这种情况下,我不再有前面的清漆).
另一个有用的工具是用于控制和监视这些服务的监督.
我还使用buildout来管理我的部署和开发沙箱(与virtualenv一起).
最简单的部署是CherryPy.您的Web应用程序也可以成为独立的Web服务器.考虑到它是用纯Python编写的,CherryPy也是一个相当快的服务器.话虽如此,它不是Apache.因此,我发现CherryPy是低容量webapps的不错选择.
除此之外,我认为这个问题没有任何正确或错误的答案.很多高容量的网站都建立在你所谈论的技术之上,我认为你不会在任何方面出错(尽管我会说我同意mod-wsgi并不是每个人都会对非apache服务器).
另外,我一直在使用isapi_wsgi在IIS下部署python应用程序.这是一个不太理想的设置,但它可以工作,当你生活在以Windows为中心的世界时,你并不总是选择其他方式.
我绝对会爱你,向我提供有关最新情况和具体应用的详细信息
何.那你问了!
像丹尼尔一样,我个人使用Apache和mod_wsgi.它仍然是新的,在某些环境中部署它可能会很困难,但如果你自己编译所有内容,那么它很容易.我发现它非常可靠,即使是早期版本.格雷厄姆·杜普顿(Graham Dumpleton)的道具几乎可以自己控制它.
但对我来说,WSGI应用程序必须跨所有可能的服务器工作.目前在这个领域还有一点漏洞:你有WSGI标准告诉你WSGI可调用(应用程序)的功能,但是没有部署的标准化; 没有一种方法可以告诉Web服务器在哪里找到该应用程序.当您更新应用程序时,也没有标准化的方法使服务器重新加载应用程序.
我采用的方法是:
模块/包中的所有应用程序逻辑,最好是类
通过继承主应用程序和覆盖成员来完成所有特定于网站的自定义
所有特定于服务器的部署设置(例如,数据库连接工厂,邮件中继设置)作为类__init __()参数
一个顶级'application.py'脚本,它使用当前服务器的正确部署设置初始化Application类,然后运行应用程序,使其可以作为CGI脚本,mod_wsgi WSGIScriptAlias(或Passenger,显然可以以相同的方式工作),或者可以从命令行进行交互
一个辅助模块,负责处理上述部署问题,并允许在应用程序依赖的模块更改时重新加载应用程序
那么application.py最终看起来像是这样的:
#!/usr/bin/env python import os.path basedir= os.path.dirname(__file__) import MySQLdb def dbfactory(): return MySQLdb.connect(db= 'myappdb', unix_socket= '/var/mysql/socket', user= 'u', passwd= 'p') def appfactory(): import myapplication return myapplication.Application(basedir, dbfactory, debug= False) import wsgiwrap ismain= __name__=='__main__' libdir= os.path.join(basedir, 'system', 'lib') application= wsgiwrap.Wrapper(appfactory, libdir, 10, ismain)
wsgiwrap.Wrapper每10秒检查一次,看看libdir中的任何应用程序模块是否已经更新,如果是这样,一些令人讨厌的sys.modules魔法可以可靠地卸载它们.然后将再次调用appfactory()以获取更新的应用程序的新实例.
(您也可以使用命令行工具,如
./application.py setup ./application.py daemon
运行应用程序可调用提供的任何设置和后台任务挂钩 - 有点像distutils的工作原理.它也像init脚本一样响应启动/停止/重启.)
我使用的另一个技巧是将多个服务器(开发/测试/生产)的部署设置放在同一个application.py脚本中,并嗅探'socket.gethostname()'以决定使用哪个特定于服务器的设置.
在某些时候,我可能会打包wsgiwrap并正确释放它(可能使用不同的名称).与此同时,如果您有兴趣,可以在http://www.doxdesk.com/file/software/py/v/wsgiwrap-0.5.py查看dogfood开发版本.
Nginx反向代理和静态文件共享+ XSendfile + uploadprogress_module.没有什么比这更好的了.
在WSGI方面,Apache + mod_wsgi或cherrypy服务器.我喜欢将cherrypy wsgi服务器用于内存较少且请求较少的服务器上的应用程序.
推理:
我用不同的工具为不同的流行解决方案做了基准测试.
我有比Web开发更低级TCP/IP的经验,尤其是http实现.我更有信心我能识别出一个好的http服务器而不是一个好的Web框架.
我知道Twang比Django或Pylons要多得多.Twisted中的http堆栈仍然没有达到这一点,但它会在那里.