部署WSGI应用程序。有很多方法可以给这只猫上皮。我目前正在使用带有mod-wsgi的apache2,但我可以看到一些潜在的问题。
那怎么办呢?
更多?
我想知道你是怎么做的,以及为什么这是最好的方法。我绝对会爱你让我了解有关最新情况和具体应用的详细信息等等。我会提出任何非疯狂的答案。
答案 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将在下个月内离开 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做两件事:
pylons
独立)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的,
简单,干净。 (只有四行网络服务器配置),其他系统管理员很容易理解。