使用WSGI部署Web.py应用,多台服务器

7 投票
3 回答
6404 浏览
提问于 2025-04-15 12:39

我创建了一个 web.py 应用,现在准备好要上线了,但我不想用 web.py 自带的服务器来运行。我希望能在不同的服务器上运行,比如 Apache 或 IIS,而不需要改动我的应用代码。我理解 WSGI 就是为此而存在的。
不过,我不太明白具体该怎么做才能让我的应用可以在 WSGI 服务器上运行?大多数例子都是基于 Pylons、Django 或其他框架的,通常只需要运行一个神奇的命令就能搞定一切。
根据我对 web.py 文档(虽然很简短)的理解,我应该用 web.application(...).wsgifunc() 来替代 web.application(...).run()。然后接下来该怎么做呢?

3 个回答

0

这里有一个使用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()
0

截至2009年7月21日,webpy安装网站上有一个更完整的安装指南,里面讨论了flupfastcgiapache等内容。我还没有尝试过,但看起来这个指南要详细得多。

6

要用特定的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

最重要的是,要把你的网络应用结构化,使其成为一个独立的模块集合。为了与特定的服务器配合使用,你需要创建一个单独的脚本文件,以便在该服务器的要求和你的应用代码之间搭建桥梁。你的应用代码应该始终放在网络服务器的文档目录之外,只有作为桥梁的脚本文件如果需要的话,才放在服务器的文档目录里。

撰写回答