当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《您如何部署WSGI应用程序?(以及为什么这是最好的方式)》经验,为你挑选了4个好方法。

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

那怎么办呢?

    Apache Mod-wsgi(其他mod-wsgi似乎不值得)

    纯Python Web服务器,例如paste,cherrypy,Spawning,Twisted.web

    as 2但是使用来自nginx,apache2等的反向代理,具有良好的静态文件处理能力

    转换为其他协议,例如带有网桥(例如Flup)的FCGI,并在传统的Web服务器中运行.

更多?

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



1> MrTopf..:

一如既往:取决于;-)

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

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

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

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

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

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



2> Jason Baker..:

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

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

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



3> bobince..:

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

何.那你问了!

像丹尼尔一样,我个人使用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的工作原理.它也像init脚本一样响应启动/停止/重启.)

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

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


在过程模块中,无法在所有情况下100%可靠地重新加载.唯一安全的方法是重新启动该过程.因此,如果你真的想要在开发中使用这些黑客,但你永远不要相信它们在生产系统中.

4> Vasil..:

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

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

推理:

我用不同的工具为不同的流行解决方案做了基准测试.

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

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

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有