Python Twisted: 如何为本地连接使用不同的资源层次?
我想为本地连接使用一种资源层级,而为其他所有连接使用另一种资源层级。我该怎么做呢?
publicSite = Site(File("/var/www/"))
localhostSite = Site(File("/var/localhost/"))
publicServer = TCPServer(80, publicSite, interface="0.0.0.0")
localhostServer = TCPServer(80, localhostSite, interface="127.0.0.1")
看起来你不能同时监听两个不同的接口。
我遇到了以下错误:
Traceback (most recent call last):
File "/usr/bin/twistd", line 21, in <module>
run()
File "/usr/lib/python2.5/site-packages/twisted/scripts/twistd.py", line 27, in run
app.run(runApp, ServerOptions)
File "/usr/lib/python2.5/site-packages/twisted/application/app.py", line 379, in run
runApp(config)
File "/usr/lib/python2.5/site-packages/twisted/scripts/twistd.py", line 23, in runApp
_SomeApplicationRunner(config).run()
File "/usr/lib/python2.5/site-packages/twisted/application/app.py", line 158, in run
self.postApplication()
File "/usr/lib/python2.5/site-packages/twisted/scripts/_twistd_unix.py", line 213, in postApplication
startApplication(self.config, self.application)
File "/usr/lib/python2.5/site-packages/twisted/scripts/_twistd_unix.py", line 174, in startApplication
service.IService(application).privilegedStartService()
File "/usr/lib/python2.5/site-packages/twisted/application/service.py", line 228, in privilegedStartService
service.privilegedStartService()
File "/usr/lib/python2.5/site-packages/twisted/application/internet.py", line 68, in privilegedStartService
self._port = self._getPort()
File "/usr/lib/python2.5/site-packages/twisted/application/internet.py", line 86, in _getPort
return getattr(reactor, 'listen'+self.method)(*self.args, **self.kwargs)
File "/usr/lib/python2.5/site-packages/twisted/internet/posixbase.py", line 467, in listenTCP
p.startListening()
File "/usr/lib/python2.5/site-packages/twisted/internet/tcp.py", line 733, in startListening
raise CannotListenError, (self.interface, self.port, le)
twisted.internet.error.CannotListenError: Couldn't listen on 127.0.0.1:80: (98, 'Address already in use').
1
1 个回答
4
对于第二个服务器,不要绑定到 0.0.0.0
,而是绑定到你服务器上的一个或多个公共地址。Twisted没有提供可以列出主机上地址的接口,也没有办法区分公共地址和私有地址(因为你的“公共”地址可能是 10.x.x.x,而防火墙可能会将流量从一个真正的公共地址转发过来)。
如果你需要发现自己的地址,而不是通过配置提供这些地址,那么在POSIX系统上,这个ioctl示例可能会对你有帮助。