如何让CherryPy仅在特定主机上监听
我有一个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
希望这对你有帮助!