如何让CherryPy仅在特定主机上监听

0 投票
2 回答
1413 浏览
提问于 2025-04-18 15:30

我有一个Flask应用程序,想用CherryPy自带的服务器来部署。我选择CherryPy是因为这样可以直接部署应用,而不需要在前面加个反向代理(比如nginx)。

我在让CherryPy只监听一个特定的主机名时遇到了问题。

假设我在提供两个网站:test1.com和test2.com(并且在我的hosts文件中设置它们指向本地)。

我的/etc/hosts文件内容如下:

127.0.0.1    test1.com test2.com

CherryPy正在为test1.com提供服务,而test2.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

你可能搞错了socket监听地址——它们只支持IP地址,而不是域名。这样设置后,CherryPy只会监听本地地址(127.0.0.1),如果你尝试使用你的以太网或无线网络的本地地址,就会出现连接被拒绝的情况。

另外,你可以用WSGI中间件来包装你的应用,这样它可以检查请求中的Host头部,确保是正确的域名,或者使用CherryPy的虚拟主机功能来检查Host头部。

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

希望这对你有帮助!

撰写回答