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

Python 如何部署WSGI应用程序?(为什么这是最好的方式),python,deployment,wsgi,Python,Deployment,Wsgi,部署WSGI应用程序。有很多方法可以剥这只猫的皮。我目前正在将apache2与mod wsgi一起使用,但是我可以看到一些潜在的问题 那么,如何做到这一点呢 Apache Mod wsgi(其他Mod wsgi似乎不值得) 纯Python web服务器,如粘贴、cherrypy、繁殖、Twisted.web 与2相同,但使用nginx、apache2等的反向代理,具有良好的静态文件处理能力 转换为其他协议,如带有网桥(如Flup)的FCGI,并在传统web服务器中运行 更多 我想知道你是怎么做的

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

那么,如何做到这一点呢

  • Apache Mod wsgi(其他Mod wsgi似乎不值得)
  • 纯Python web服务器,如粘贴、cherrypy、繁殖、Twisted.web
  • 与2相同,但使用nginx、apache2等的反向代理,具有良好的静态文件处理能力
  • 转换为其他协议,如带有网桥(如Flup)的FCGI,并在传统web服务器中运行
  • 更多

    我想知道你是怎么做的,为什么这是最好的方法。我绝对希望你让我厌烦关于什么和为什么,应用程序特定的东西等的细节。我将投票支持任何非疯狂的答案。

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

    当我不需要任何apache特性时,我会使用纯python Web服务器,如paste等。我想哪一个完全取决于您的应用程序,可以通过执行一些基准测试来确定。我一直想做一些事情,但从来没有实现过。我想在使用非阻塞IO开箱即用时,产卵可能会有一些优势,但我有时会遇到问题,因为它正在进行修补

    当然,你也可以在前面涂上清漆

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

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

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


    另外,我还使用它来管理部署和开发沙盒(以及)。

    部署CherryPy绝对是最简单的。您的web应用程序也可以成为独立的web服务器。CherryPy也是一个相当快的服务器,因为它是用纯Python编写的。尽管如此,它不是Apache。因此,我发现CherryPy是低容量Web应用程序的好选择

    除此之外,我不认为这个问题有任何正确或错误的答案。很多高容量的网站都是基于您提到的技术构建的,我认为您在这些方面都不会犯太大的错误(尽管我同意mod wsgi在所有非apache服务器上都没有达到标准)


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

    我正在使用Google App Engine开发一个应用程序。它运行WSGI应用程序。


    这是我真正开发的第一个web应用程序,所以我没有比较的基础,但是如果你是谷歌的粉丝,你可能想看看它。我用它作为我的学习框架很有意思

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


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

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

    工作起来很有魅力。

    Apache+mod\u wsgi

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

    我绝对希望你给我讲一些关于什么、为什么、具体应用的细节等等

    呵呵。是你自找的

    像Daniel一样,我个人使用Apache和mod_wsgi。它仍然很新,在某些环境中部署它可能会很困难,但如果您自己编译所有内容,那么它就相当容易了。我发现它非常可靠,即使是早期版本。这是格雷厄姆·邓普尔顿的道具,因为他几乎完全靠自己控制了比赛

    然而,对我来说,WSGI应用程序跨所有可能的服务器工作是至关重要的。目前在这方面还存在一些漏洞:WSGI标准告诉您WSGI可调用(应用程序)的功能,但没有标准化部署;没有单一的方法告诉web服务器在哪里找到应用程序。在更新应用程序时,也没有标准化的方法让服务器重新加载应用程序

    我采用的方法是:

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

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

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

    • 一个顶级“application.py”脚本,该脚本使用当前服务器的正确部署设置初始化应用程序类,然后运行应用程序,使其可以作为CGI脚本、mod_wsgi WSGIScriptAlias(或Passenger,其工作方式显然相同)部署,或者可以从命令行与进行交互

    • 一个帮助器模块,用于处理上述部署问题,并允许在应用程序依赖的模块运行时重新加载应用程序
      #!/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)
      
      ./application.py setup
      ./application.py daemon
      
      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 $ paster create -t pylons helloworld $ cd helloworld $ paster serve --reload development.ini