在多个域名上运行多个Python web应用(虚拟主机)?

0 投票
2 回答
525 浏览
提问于 2025-04-17 02:34

我现在很困惑,也很绝望。

我想知道,能不能在不同的域名上,用cherrypy的虚拟主机同时运行多个Python网页应用?等等……我自己来回答:可以的。通过虚拟主机调度器是可以做到的,但我有一个要求:

我需要使用同一个应用的多个实例,但版本不同。这就意味着我需要以某种方式为这些应用的Python import分开命名空间。

举个例子: 我有一个应用叫MyApp,它有两个版本。我有两个域名app1.comapp2.com。 当我访问app1.com时,我希望得到MyApp的版本1。当我访问app2.com时,应该是MyApp的版本2。

我现在使用的是cherrypy 3.2VirtualHostDispatcher,问题是,当我从版本1的MyApp中导入某些方法,而版本2的MyApp已经被加载过,Python会使用已经导入的模块(因为模块缓存的原因)。

是的……可以通过封装导入并每次清理Python模块缓存来解决这个问题(我在创建顶层应用对象时使用这个方法),但我觉得这样做不太干净……而且效率也可能不高……

那么,你有什么建议吗? 我在考虑使用apache2和cherrypy结合Mod_WSGI,但这似乎并不能解决import的问题,因为所有应用还是共享一个Python进程。

也许,我对这个问题的思考方式完全错误,我需要重新考虑一下。我对任何想法或建议都持开放态度。唯一的限制是我想使用Python 3。其他的都可以讨论 :-)

谢谢你们的每一个回复!

2 个回答

0

关于创建一个叫做 myapp_selector 的模块,它可以做类似这样的事情:

def application(env, start_response):
    import myapp1
    import myapp2
    if env['SERVER_NAME'] == 'myapp1.com':
        myapp = myapp1
    elif env['SERVER_NAME'] == 'myapp2.com':
        myapp = myapp2
    # ...
    return myapp.process_request()
1

Apache和mod_wsgi可以满足你的需求。在mod_wsgi下,每个挂载的网页应用会在同一个进程里运行,但它们会使用不同的子解释器,这样就可以使用不同的代码库。更棒的是,你可以使用mod_wsgi的守护进程模式,把每个网页应用分配到不同的进程中,这样就不会有相互干扰的风险。

撰写回答