我有一个烧瓶应用程序,我想使用CherryPy的内置服务器进行部署。我选择了CherryPy,以便可以部署应用程序而无需反向代理(即前面的nginx)。
我无法让CherryPy只在一个主机名上听取请求。
假设我正在为2个站点提供服务:test1.com和test2.com(并将它们设置在我的hosts文件中以指向localhost)。
我的/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
我在这里遗漏了什么吗?我查看过很多文档和教程,但所有内容都表明此代码段应该按照我的预期运行。
由于
答案 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
希望这有帮助!