使用WSGI部署Web.py应用,多台服务器
我创建了一个 web.py 应用,现在准备好要上线了,但我不想用 web.py 自带的服务器来运行。我希望能在不同的服务器上运行,比如 Apache 或 IIS,而不需要改动我的应用代码。我理解 WSGI 就是为此而存在的。
不过,我不太明白具体该怎么做才能让我的应用可以在 WSGI 服务器上运行?大多数例子都是基于 Pylons、Django 或其他框架的,通常只需要运行一个神奇的命令就能搞定一切。
根据我对 web.py 文档(虽然很简短)的理解,我应该用 web.application(...).wsgifunc()
来替代 web.application(...).run()
。然后接下来该怎么做呢?
3 个回答
这里有一个使用cherrypy wsgi服务器的两个托管应用的例子:
#!/usr/bin/python from web import wsgiserver import web # webpy wsgi app urls = ( '/test.*', 'index' ) class index: def GET(self): web.header("content-type", "text/html") return "Hello, world1!" application = web.application(urls, globals(), autoreload=False).wsgifunc() # generic wsgi app def my_blog_app(environ, start_response): status = '200 OK' response_headers = [('Content-type','text/plain')] start_response(status, response_headers) return ['Hello world! - blog\n'] """ # single hosted app server = wsgiserver.CherryPyWSGIServer( ('0.0.0.0', 8070), application, server_name='www.cherrypy.example') """ # multiple hosted apps with WSGIPathInfoDispatcher d = wsgiserver.WSGIPathInfoDispatcher({'/test': application, '/blog': my_blog_app}) server = wsgiserver.CherryPyWSGIServer(('0.0.0.0', 8070), d) server.start()
截至2009年7月21日,webpy安装网站上有一个更完整的安装指南,里面讨论了flup、fastcgi、apache等内容。我还没有尝试过,但看起来这个指南要详细得多。
要用特定的WSGI托管方式来运行你的应用,具体步骤会根据服务器的不同而有所变化。
如果你使用的是Apache/mod_wsgi或者Phusion Passenger,你只需要提供一个WSGI脚本文件,这个文件里要有一个叫做'application'的对象。对于web.py 0.2版本来说,这个对象是通过调用web.wsgifunc()并传入合适的参数得到的。而在web.py 0.3版本中,你需要使用web.application()返回的对象里的wsgifunc()成员函数。想了解更多细节,可以查看mod_wsgi的文档:
http://code.google.com/p/modwsgi/wiki/IntegrationWithWebPy
如果你需要使用FASTCGI、SCGI或AJP适配器,比如在Lighttpd、nginx或Cherokee服务器上,那么你需要使用'flup'这个包来搭建一个桥梁,把这些与语言无关的接口和WSGI连接起来。这意味着你需要调用一个flup函数,使用上面提到的WSGI应用对象,这样的对象在mod_wsgi或Phusion Passenger中可以直接使用,而不需要桥梁。想了解更多细节,可以查看:
http://trac.saddi.com/flup/wiki/FlupServers
最重要的是,要把你的网络应用结构化,使其成为一个独立的模块集合。为了与特定的服务器配合使用,你需要创建一个单独的脚本文件,以便在该服务器的要求和你的应用代码之间搭建桥梁。你的应用代码应该始终放在网络服务器的文档目录之外,只有作为桥梁的脚本文件如果需要的话,才放在服务器的文档目录里。