如何使用单个服务器在多个域上部署多个WSGI应用程序?

时间:2014-01-29 01:08:11

标签: python flask wsgi

假设

  • 我有一个名为myserver的Linux VPS服务器,安装在myserver.com

  • 在此服务器上,我有两个Flask WSGI应用app-oneapp-two

  • 我想在myserver上部署这两个应用,但我希望它们安装在域app-one.comapp-two.com上。

  • 应用程序没有外部依赖项(没有数据库,缓存等)。它们是独立的单文件应用程序。

  • 我没有安装Apache,NGinX或任何其他网络服务器软件;只是Python,Flask和两个WSGI应用程序。

  • 我有Python / Flask经验,但我对WSGI部署或多域工作没有太多经验。基本说明和/或阅读材料表示赞赏。

问题/ TL; DR

如何使用在一个域上安装的服务器将两个WSGI应用程序部署到两个域?我是否需要安装特别针对此案例的软件,或者只是将应用程序指向我选择的域名?

感谢您提供任何建议。

1 个答案:

答案 0 :(得分:2)

将DNS设置为将app-one.comapp-two.com指向myserver.com的IP地址后,您需要设置一些内容来路由来自端口80的请求(或443如果您要对每个应用程序使用SSL)。这通常通过Apachenginx中的虚拟主机完成。

如果您需要在同一个Python进程中运行这两个应用程序(无论您是否使用非Python Web服务器作为您的应用程序容器),那么您需要手动分发到每个应用程序:

from werkzeug.exceptions import NotImplemented
from werkzeug.wsgi import get_host

class DomainDispatcher(object):
    """Simple domain dispatch"""
    def __init__(self, domain_handlers, default_handler=None):
        self.domain_handlers = domain_handlers
        self.default_handler = domain_handlers.get("default", default_handler)
        if self.default_handler is None:
            self.default_handler = NotImplemented()

    def __call__(self, environ, start_response):
        host = get_host(environ)
        handler = self.domain_handlers.get(host, self.default_handler)
        return handler(environ, start_response)

使用示例:

from app_one import app as app1
from app_two import app as app2

from domain_dispatcher import DomainDispatcher

dispatcher = DomainDispatcher({'app-one.com': app1, 'app-two.com': app2})

if __name__ == '__main__':
    # Wrap dispatcher in a WSGI container
    # such as CherryPy