【问题标题】:How do YOU deploy your WSGI application? (and why it is the best way)你如何部署你的 WSGI 应用程序? (以及为什么这是最好的方法)
【发布时间】:2010-10-09 02:42:35
【问题描述】:

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

那怎么做呢?

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

更多?

我想知道您是如何做到的,以及为什么这是最好的方法。我绝对喜欢你让我厌烦关于什么和为什么、应用程序特定的东西等的细节。我会赞成任何非疯狂的答案。

【问题讨论】:

  • 你能澄清一下吗?部署是将代码放入环境的行为,而不是选择 mod_wsgi 而不是 cherrypy。涉及升级、安装、推送到多台服务器等;不仅仅是重启 apache,或者运行 easy_install。
  • Richard:部署是选择,也是行动。

标签: python deployment wsgi


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    我非常希望您能详细了解具体情况和原因、特定于应用程序的内容等

    嗬。好吧,你要求的!

    和 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
    

    运行应用程序 callable 提供的任何设置和后台任务挂钩 — 有点像 distutils 的工作方式。它还像初始化脚本一样响应启动/停止/重启。)

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

    在某些时候,我可能会将 wsgiwrap 打包并正确发布(可能使用不同的名称)。同时,如果您有兴趣,可以在http://www.doxdesk.com/file/software/py/v/wsgiwrap-0.5.py 看到 dogfood-development 版本。

    【讨论】:

    • 进程中的模块重新加载不能在所有情况下都 100% 可靠地工作。唯一安全的方法是重新启动该过程。因此,如果您真的想在开发中使用此类 hack,但您永远不应该在生产系统中信任它们。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      推理:

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

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          TurboGears (2.0)

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

          它在 1.x 系列中具有用于测试和部署的 tg* 工具,但现在已转换为 2.0 系列中的 paster 等效项,如果您使用过 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 的设置指南here。这将扩大到大多数需求。

          【讨论】:

            【解决方案7】:

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

            像魅力一样工作。

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

                Apache+mod_wsgi,

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2018-05-03
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-06-03
                  • 2010-09-08
                  • 2011-03-24
                  • 2018-02-10
                  相关资源
                  最近更新 更多