42

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

那么怎么做呢?

  1. Apache Mod-wsgi(其他 mod-wsgi 似乎不值得)
  2. 纯 Python Web 服务器,例如 paste、cherrypy、Spawning、Twisted.web
  3. 作为 2,但使用来自 nginx、apache2 等的反向代理,具有良好的静态文件处理能力
  4. 通过桥接器(例如 Flup)转换为其他协议(例如 FCGI)并在常规 Web 服务器中运行。

更多的?

我想知道你是怎么做的,为什么这是最好的方法。我绝对希望您能详细介绍有关内容和原因、应用程序特定内容等的详细信息。我会支持任何非疯狂的答案。

4

9 回答 9

26

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

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

当然,您也可以随时在前面放上清漆。

如果需要 Apache,我通常会使用解决方案 3,以便将进程分开。您还可以更轻松地将进程移动到其他服务器等。我只是喜欢将事情分开。

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

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

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

于 2009-02-22T01:39:56.040 回答
13

最容易部署的是 CherryPy。您的 Web 应用程序也可以成为独立的 Web 服务器。CherryPy 也是一个相当快的服务器,因为它是用纯 Python 编写的。话虽如此,它不是 Apache。因此,我发现 CherryPy 是低容量 webapps 的不错选择。

除此之外,我认为这个问题没有任何正确或错误的答案。许多大容量网站都是建立在您所谈论的技术之上的,我认为您在这些方式中的任何一种都不会出错(尽管我会说我同意 mod-wsgi 并不是每非 Apache 服务器)。

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

于 2009-02-22T20:36:33.920 回答
13

我绝对希望您能详细介绍有关内容和原因、应用程序特定内容等的详细信息

何。好吧,你要求它!

和 Daniel 一样,我个人将 Apache 与 mod_wsgi 一起使用。它仍然很新,在某些环境中部署它可能会很困难,但如果你自己编译所有东西,那很容易。我发现它非常可靠,即使是早期版本。支持格雷厄姆·邓普顿(Graham Dumpleton)几乎独自控制它。

但是对我来说,WSGI 应用程序必须在所有可能的服务器上工作。目前在这个领域有一点漏洞:你有 WSGI 标准告诉你 WSGI 可调用(应用程序)做什么,但是没有标准化的部署;没有一种方法可以告诉 Web 服务器在哪里可以找到应用程序。当您更新应用程序时,也没有标准化的方法可以让服务器重新加载应用程序。

我采用的方法是:

  • 模块/包中的所有应用程序逻辑,最好在类中

  • 通过子类化主应用程序和覆盖成员来完成所有特定于网站的定制

  • 所有特定于服务器的部署设置(例如数据库连接工厂、邮件中继设置)作为类 __init__() 参数

  • 一个顶级的“application.py”脚本,它使用当前服务器的正确部署设置初始化应用程序类,然后以可以部署为 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看到 dogfood-development 版本。

于 2009-03-07T22:15:27.943 回答
6

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

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

推理:

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

与 Web 开发相比,我在较低级别的 TCP/IP 方面有更多经验,尤其是 http 实现。我更有信心识别一个好的 http 服务器,而不是识别一个好的 web 框架。

我比 Django 或 Pylons 更了解 Twisted。Twisted 中的 http 堆栈还没有达到这个要求,但它会在那里。

于 2009-03-11T18:06:50.380 回答
4

我正在将 Google App Engine 用于我正在开发的应用程序。它运行 WSGI 应用程序。 这里有一些关于它的信息。

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

于 2009-02-24T12:47:38.523 回答
4

涡轮齿轮 (2.0)

TurboGears 2.0将在下个月内离开Beta 版(已经使用了很长时间)。2.0 在 1.0 系列的基础上进行了改进,并尝试为您提供同类最佳的 WSGI 堆栈,因此如果您想要最少的麻烦,它会为您提供一些默认选择。

它具有tg*1.x 系列中用于测试和部署的工具,但现在已转换为paster2.0 系列中的等效工具,如果您已经体验过pylons.

tg-admin 快速入门 —> 粘贴快速入门
tg-admin 信息 —> 粘贴 tginfo
tg-admin 工具箱 -> 粘贴工具箱
tg-admin 外壳 –> 粘贴外壳
tg-admin sql create –> paste setup-app development.ini

塔架

如果您希望在您的 WSGI 堆栈中更加灵活(ORM 的选择、模​​板程序的选择、形成的选择),Pylons 正在成为统一的选择。这将是我推荐的选择,因为它提供了出色的文档并允许您尝试不同的组件。

因此,很高兴使用它,并且可以在 Apache(生产部署)或独立(有助于测试和实验阶段)下工作。

因此,您可以同时使用 Pylons:

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

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

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

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

对于生产级部署,您可以参考此处Apache + FastCGI + mod_rewrite提供的设置指南。这将扩大到大多数需求。

于 2009-03-10T07:08:23.823 回答
3

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

奇迹般有效。

于 2009-03-04T21:53:23.327 回答
1

我们将纯粘贴用于我们的一些网络服务。它很容易部署(使用我们的内部部署机制;我们不使用 Paste Deploy 或类似的东西),并且可以最大限度地减少生产系统与开发人员工作站上运行的系统之间的差异。警告:由于我们请求的重量级性质,我们不期望 Paste 本身的低延迟。在我们做的一些粗略的基准测试中,我们并没有得到很好的结果。由于我们典型的请求处理程序的开销,它最终变得没有意义。到目前为止,它运行良好。

静态数据由完全独立的(并且在某种程度上“有机地”增长的)堆栈处理,包括以各种方式使用 S3、Akamai、Apache 和 IIS。

于 2009-03-04T21:48:27.207 回答
1

阿帕奇+mod_wsgi,

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

于 2009-03-05T21:34:32.553 回答