你如何部署你的WSGI应用程序? (为什么这是最好的方式)
部署WSGI应用程序。 有很多方法来剥皮这只猫。 我目前使用mod-wsgi的apache2,但我可以看到一些潜在的问题。
那么怎么做呢?
- Apache Mod-wsgi(其他mod-wsgi似乎不值得)
- 纯Pythonnetworking服务器,如粘贴,cherrypy,产卵,Twisted.web
- 作为2,但与反向代理从nginx,apache2等,良好的静态文件处理
- 转换到其他协议,如FCGI与桥梁(如Flup),并运行在传统的Web服务器。
更多?
我想知道你是如何做到的,为什么这是最好的办法。 我绝对会喜欢你,让我知道什么和什么,具体应用的细节等细节。我会upvote任何非疯狂的答案。
一如既往:取决于;-)
当我不需要任何apachefunction时,我将使用一个纯粹的python web服务器,比如粘贴等。我猜测哪一个完全取决于您的应用程序,可以通过做一些基准testing来决定。 我一直想做一些,但从来没有来过。 我猜Spawning可能在使用非阻塞IO方面有一些优点,但是由于修补正在进行,我有时会遇到问题。
当然,你也可以自由地把清漆放在前面。
如果需要Apache,我通常会使用解决scheme3,这样我就可以将进程分开。 您也可以更轻松地将stream程移动到其他服务器等。我只是喜欢把事情分开。
对于静态文件我现在正在使用一个单独的服务器为一个项目,只是提供静态图像/ CSS / JS。 我使用lighttpd作为Web服务器,它具有很好的性能(在这种情况下,我没有在前面的清漆)。
另一个有用的工具是supervisord来控制和监视这些服务。
我另外使用buildout来pipe理我的部署和开发沙箱(以及virtualenv )。
我绝对会爱你,让我知道关于什么和什么的细节,应用程序的具体内容等
何。 那么你问它!
像丹尼尔我个人使用mod_wsgi Apache。 在一些环境中部署它仍然是一个新的事情,但是如果你自己编译所有的东西,那么这很容易。 我发现它非常可靠,甚至是早期版本。 道格拉姆·杜姆普尔顿(Graham Dumpleton)非常自负地控制它。
但对我来说,WSGI应用程序在所有可能的服务器上工作是非常重要的。 目前在这个领域有一些漏洞:你有WSGI标准告诉你一个WSGI可调用(应用程序)是做什么的,但是没有标准化的部署; 没有一种方法可以告诉Web服务器在哪里find应用程序。 也没有标准的方法来让服务器在你更新的时候重新加载应用程序。
我采用的方法是把:
-
模块/软件包中的所有应用程序逻辑,最好在类中
-
所有网站特定的定制都是通过inheritance主应用程序和覆盖成员来完成的
-
所有服务器特定的部署设置(例如数据库连接工厂,邮件中继设置)作为类__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的工作原理。 它也像初始化脚本一样响应启动/停止/重启。)
我使用的另一个技巧是将多个服务器(开发/testing/生产)的部署设置放在同一个application.py脚本中,然后嗅探“socket.gethostname()”来决定使用哪个服务器特定的一组设置。
在某些时候,我可能会打包wsgiwrap并正确释放它(可能以不同的名称)。 与此同时,如果您有兴趣,可以在http://www.doxdesk.com/file/software/py/v/wsgiwrap-0.5.py上看到dogfood-development版本。;
CherryPy绝对最容易部署。 您的Web应用程序也可以成为独立的Web服务器。 CherryPy也是一个相当快的服务器,考虑到它是用纯Python编写的。 这就是说,这不是Apache。 因此,我发现CherryPy是较小卷web应用程序的不错select。
除此之外,我不认为这个问题有任何正确或错误的答案。 很多大量的网站build立在你所谈论的技术基础之上,我不认为你可以用任何方式去错误(虽然我会说,我同意mod-wsgi不会对每一个非Apache服务器)。
另外,我一直在使用isapi_wsgi在IIS下部署Python应用程序。 这是一个不太理想的设置,但是它起作用,而且当你生活在一个以Windows为中心的世界中时,你并不总是能够select。
Nginx反向代理和静态文件共享+ XSendfile + uploadprogress_module。 没有什么比这个目的更胜一筹。
在WSGI方面Apache + mod_wsgi或cherrypy服务器。 我喜欢将cherrypy wsgi服务器用于内存较less,请求较less的服务器上。
推理:
我已经为不同的stream行解决scheme用不同的工具做了基准testing。
我有更低级的TCP / IP比web开发更多的经验,特别是http实现。 我更加确信,我可以识别出一个好的http服务器,而不是我能识别出一个好的web框架。
我知道比Django或Pylons更扭曲。 Twisted中的http堆栈仍然没有达到这个目标,但它会在那里。
我正在使用Google App Engine开发我正在开发的应用程序。 它运行WSGI应用程序。 这里有几点信息。
这是我所做过的第一个networking应用程序,所以我没有比较的基础,但是如果你是一个Google粉丝,你可能需要研究一下。 作为我的学习框架,我有很多的乐趣。
TurboGears(2.0)
TurboGears 2.0将在下个月内离开Beta版本 (已经有足够的时间了)。 2.0改进了1.0系列,并试图给你最好的WSGI堆栈,所以它为你做了一些默认的select,如果你想要的最less的大惊小怪。
它具有用于1.x系列testing和部署的tg*
工具,但是现在已经转换为2.0系列中的等效贴图,如果您已经使用了pylons
,则它们似乎很熟悉。
tg-admin快速入门 - >贴纸快速入门 tg-admin info - > paster tginfo tg-admin工具箱 - > paster工具箱 tg-admin shell - > paster shell tg-admin sql create - > paster setup-app development.ini
主塔
您希望在WSGI堆栈(ORM的select,模板select,formsselect)方面更加灵活,主塔正在成为综合select。 这将是我推荐的select ,因为它提供了优秀的文档,并允许您尝试不同的组件。
作为一个结果工作是一种乐趣,并在Apache(生产部署)下工作或独立(有助于testing和试验阶段)。
所以接下来,你可以做两个主塔:
-
2testing阶段选项(
python
standalone) -
4用于可扩展的生产目的(
FastCGI
,假设您select的数据库可以跟上)
Pylonspipe理界面与TurboGears非常相似。 这是一个玩具独立的例子:
$ paster create -t pylons helloworld $ cd helloworld $ paster serve --reload development.ini
对于生产级的部署,可以参考Apache + FastCGI + mod_rewrite
的设置指南Apache + FastCGI + mod_rewrite
可以在这里find 。 这将扩大到大多数需求。
Apache httpd + mod_fcgid使用web.py(这是一个wsgi应用程序)。
奇迹般有效。
我们正在使用纯粘贴为我们的一些Web服务。 这很容易部署(使用我们的内部部署机制;我们没有使用Paste Deploy或类似的东西),最好是尽量减less生产系统和开发人员工作站上运行的东西之间的差异。 警告:由于我们要求的重量级性质,我们并不期望粘贴本身的低延迟。 在一些粗糙的基准testing中,我们没有得到太棒的结果。 它只是由于我们典型的请求处理程序的花费而结束了。 到目前为止,它工作得很好。
静态数据已被完全分离(有些“有机”增长)堆栈处理,包括以各种方式使用S3,Akamai,Apache和IIS。
阿帕奇+ mod_wsgi的,
简单,干净。 (只有四行web服务器configuration),很容易让其他sysadimns得到他们的头。