您如何部署WSGI应用程序? (以及为什么这是最好的方式)

时间:2009-02-22 00:58:37

标签: python deployment wsgi

部署WSGI应用程序。有很多方法可以给这只猫上皮。我目前正在使用带有mod-wsgi的apache2,但我可以看到一些潜在的问题。

那怎么办呢?

  1. Apache Mod-wsgi(其他mod-wsgi似乎不值得)
  2. 纯Python Web服务器,例如paste,cherrypy,Spawning,Twisted.web
  3. as 2但是使用来自nginx,apache2等的反向代理,具有良好的静态文件处理
  4. 使用网桥(例如Flup)转换为其他协议(如FCGI)并在传统的Web服务器中运行。
  5. 更多?

    我想知道你是怎么做的,以及为什么这是最好的方法。我绝对会你让我了解有关最新情况和具体应用的详细信息等等。我会提出任何非疯狂的答案。

9 个答案:

答案 0 :(得分:26)

一如既往:这取决于; - )

当我不需要任何apache功能时,我会使用纯粹的python网络服务器,如粘贴等。我猜测哪一个完全取决于你的应用程序,可以通过做一些基准来决定。我一直想做一些但从未接受过。我想Spawning在使用非阻塞IO开箱即可能有一些优势,但我有时会遇到问题,因为它正在修补它。

当然,你总是可以在前面放一块清漆。

如果需要Apache,我通常会使用解决方案3,这样我就可以将进程分开。您还可以更轻松地将流程移动到其他服务器等。我只想将事物分开。

对于静态文件,我现在正在使用一个单独的服务器来处理一个只提供静态图像/ css / js的项目。我使用lighttpd作为网络服务器,性能很好(在这种情况下我不再有前面的清漆)。

另一个有用的工具是supervisord,用于控制和监控这些服务。

我还使用buildout来管理我的部署和开发沙箱(以及virtualenv)。

答案 1 :(得分:13)

部署绝对最简单的是CherryPy。您的Web应用程序也可以成为独立的Web服务器。考虑到它是用纯Python编写的,CherryPy也是一个相当快的服务器。话虽如此,它不是Apache。因此,我发现CherryPy是小批量Web应用程序的不错选择。

除此之外,我认为对这个问题没有任何正确或错误的答案。很多高容量的网站都是基于你所谈论的技术而建立的,我认为你不会在任何方面出错(尽管我会说我同意mod-wsgi并不是每个人都能使用snuff非apache服务器)。

另外,我一直在使用isapi_wsgi在IIS下部署python应用程序。这是一个不太理想的设置,但它可以工作,当你生活在以Windows为中心的世界时,你并不总是选择其他方式。

答案 2 :(得分:13)

  

我绝对会爱你,向我提供有关最新情况和具体应用的详细信息等等。

何。那么你问了!

像丹尼尔一样,我个人将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的工作方式。它还像初始化脚本一样响应启动/停止/重启。)

我使用的另一个技巧是将多个服务器(开发/测试/生产)的部署设置放在同一个application.py脚本中,然后嗅探'socket.gethostname()'以决定哪个服务器特定的设置为使用

在某些时候,我可能打包wsgiwrap并正确释放它(可能使用不同的名称)。与此同时,如果您有兴趣,可以在http://www.doxdesk.com/file/software/py/v/wsgiwrap-0.5.py看到狗食开发版本。

答案 3 :(得分:6)

Nginx反向代理和静态文件共享+ XSendfile + uploadprogress_module。没有什么比这更好的了。

在WSGI端,Apache + mod_wsgi或者cherrypy服务器。我喜欢将cherrypy wsgi服务器用于内存较少且请求较少的服务器上的应用程序。

推理:

我已经使用不同的工具为不同的流行解决方案做过基准测试。

我比较低级别的TCP / IP有更多的经验,尤其是http实现。我更有信心能识别出一个好的http服务器而不是一个好的Web框架。

我知道Twang比Django或Pylons要多得多。 Twisted中的http堆栈仍然没有达到这一目标,但它会在那里。

答案 4 :(得分:4)

我正在使用Google App Engine来开发我正在开发的应用程序。它运行WSGI应用程序。 Here's a couple bits of info on it.

这是我用过的第一个网络应用程序,所以我没有比较基础,但如果你是谷歌粉丝,你可能想要调查一下。我使用它作为我的学习框架有很多乐趣。

答案 5 :(得分:4)

TurboGears(2.0)

TurboGears 2.0将在下个月内离开 Beta (已经有很长时间了)。 2.0改进了1.0系列并尝试为您提供最佳的WSGI堆栈,因此如果您想要最少的话,它会为您做出一些默认选择。

它拥有tg*工具,可以在1.x系列中进行测试和部署,但现在转换为2.0系列中的paster等价物,如果你用{{1}进行了精确定位,这似乎很熟悉}。

tg-admin quickstart —> paster quickstart
tg-admin info —> paster tginfo
tg-admin toolbox –> paster toolbox
tg-admin shell –> paster shell
tg-admin sql create –> paster setup-app development.ini

您希望在WSGI堆栈中更灵活(选择ORM,选择模板,选择成型),Pylons正在成为综合选择。这将是我推荐的选择,因为它提供了出色的文档,并允许您尝试不同的组件。

很高兴能够在结果中工作,并在Apache(生产部署)或独立工作(有助于测试和试验阶段)。

所以接下来,你可以用Pylons做两件事:

  • 2测试阶段的选项(pylons独立)

  • 4用于可扩展的生产目的(python,假设您选择的数据库可以跟上)

Pylons管理界面与TurboGears非常相似。这是一个玩具独立示例:

$ paster create -t pylons helloworld
$ cd helloworld
$ paster serve --reload development.ini

对于生产级部署,您可以参考FastCGI的设置指南here。这可以扩展到大多数需求。

答案 6 :(得分:3)

Apache httpd + mod_fcgid使用web.py(这是一个wsgi应用程序)。

像魅力一样。

答案 7 :(得分:1)

我们正在为我们的一些Web服务使用纯Paste。它易于部署(使用我们的内部部署机制;我们不使用Paste Deploy或类似的东西),最好尽量减少生产系统与开发人员工作站上运行的系统之间的差异。警告:由于我们的请求具有重量级特性,因此我们不希望粘贴本身具有低延迟。在一些粗略的基准测试中,我们没有得到梦幻般的结果;由于我们典型的请求处理程序的费用,它最终没有实际意义。到目前为止,它运作良好。

静态数据由完全独立的(有些“有机”增长)堆栈处理,包括以各种方式使用S3,Akamai,Apache和IIS。

答案 8 :(得分:1)

阿帕奇+ mod_wsgi的,

简单,干净。 (只有四行网络服务器配置),其他系统管理员很容易理解。