如何让CherryPy只在特定主机上收听

时间:2014-07-31 15:13:54

标签: python flask webserver wsgi cherrypy

我有一个烧瓶应用程序,我想使用CherryPy的内置服务器进行部署。我选择了CherryPy,以便可以部署应用程序而无需反向代理(即前面的nginx)。

我无法让CherryPy只在一个主机名上听取请求。

假设我正在为2个站点提供服务:test1.com和test2.com(并将它们设置在我的hosts文件中以指向localhost)。 我的/etc/hosts文件:

127.0.0.1    test1.com test2.com

CherryPy正在服务test1.comtest2.com没有任何服务。

我的cherrypy文件如下:

import cherrypy

from my_test_flask_app import app

if __name__ == '__main__':

    cherrypy.tree.graft(app, "/")

    cherrypy.server.unsubscribe()

    server = cherrypy._cpserver.Server()

    server.socket_host = "test1.com"
    server.socket_port = 8030
    server.thread_pool = 30

    server.subscribe()

    cherrypy.engine.start()
    cherrypy.engine.block()

以这种方式设置,我在浏览器上转到test1.com:8030,它按预期工作。

但是当我转到test2.com:8030时,会投放相同的应用。我预计它不会提供任何服务,因为CherryPy没有设置来监听test2.com

对我来说,似乎CherryPy只是在监听给定端口上的所有内容(8030),并将socket_host部分视为0.0.0.0

我在这里遗漏了什么吗?我查看过很多文档和教程,但所有内容都表明此代码段应该按照我的预期运行。

由于

2 个答案:

答案 0 :(得分:0)

您误解了套接字侦听地址 - 它们只是IP地址,而不是DNS名称。设置这种方式,CherryPy仅侦听localhost(127.0.0.1) - 尝试使用您的Ethernet / Wlan本地地址,您应该拒绝连接。

此外,您可以使用WSGI中间件包装应用程序,该中间件检查适当域的主机头,或使用CherryPy虚拟主机工具检查主机头。

答案 1 :(得分:0)

以下是如何设置您想要的内容......

root = Root()
RootApp = cherrypy.Application(root)
Domain2App = cherrypy.Application(root)
SecureApp = cherrypy.Application(Secure())

vhost = cherrypy._cpwsgi.VirtualHost(RootApp,
    domains={'www.domain2.example': Domain2App,
             'www.domain2.example:443': SecureApp,
             })

cherrypy.tree.graft(vhost)

https://cherrypy.readthedocs.org/en/3.3.0/refman/_cpwsgi.html#classes

希望这有帮助!