如何简单地在OpenShift上部署Twisted服务器
我已经设置好了正确的环境,使用的是Python 2.7.5,安装了Twisted,并且在Python Shell中导入也没有问题。
我有一个非常简单的服务器实例,用来显示一个登录页面,在本地机器上运行得很好。
from twisted.web import http
class MyRequestHandler(http.Request):
pages={
'/': '<h1>Geo-Address Server</h1>Twisted Server is Up and Running..',
'/test': '<h1>Test</h1>Test page',
}
def process(self):
print self.path
if self.pages.has_key(self.path):
self.write(self.pages[self.path])
else:
self.setResponseCode(http.NOT_FOUND)
self.write("<h1>Not Found</h1>Sorry, page does not exist")
self.finish()
class MyHttp(http.HTTPChannel):
requestFactory=MyRequestHandler
class MyHttpFactory(http.HTTPFactory):
protocol=MyHttp
if __name__=='__main__':
from twisted.internet import reactor
reactor.listenTCP(8080, MyHttpFactory())
reactor.run()
但是,把这个部署到Openshift服务器上时却无法运行。如果我尝试运行这个脚本,
python script.py &
我会收到以下错误信息:
reactor.listenTCP(8080, MyHttpFactory()) 文件 "/var/lib/openshift/5378ea844382ec89da000432/python/virtenv/lib/python2.7/site-packages/twisted/internet/posixbase.py", 第495行,listenTCP p.startListening() 文件 "/var/lib/openshift/5378ea844382ec89da000432/python/virtenv/lib/python2.7/site-packages/twisted/internet/tcp.py", 第979行,startListening raise CannotListenError(self.interface, self.port, le) twisted.internet.error.CannotListenError: 无法在任何:8080上监听: [错误号 13] 权限被拒绝。
在浏览StackOverflow的时候,大多数人都说要绑定到8080端口(我已经这样做了),但我还是遇到了同样的错误。
1 个回答
根据知识库的说明:
请注意:我们不允许在外部可访问的IP地址上随意绑定端口。
你可以在内部IP上绑定端口,范围是15000到35530。其他端口是保留给特定进程使用的,以避免冲突。因为我们是在内部IP上绑定,所以你需要使用端口转发来访问它:https://openshift.redhat.com/community/blogs/getting-started-with-port-forwarding-on-openshift
所以,首先要找出$OPENSHIFT_PYTHON_IP。
echo $OPENSHIFT_PYTHON_IP
然后把这个地址添加到反应器监听器的接口中。
reactor.listenTCP(15000, MyHttpFactory(), interface='127.X.X.X')
另一种(也是最好的)方法是直接在代码中获取这个值。这样,如果IP地址动态变化,你仍然能获取到当前的IP。
import os
local_hostname =os.getenv("OPENSHIFT_INTERNAL_IP")
..
..
reactor.listenTCP(15000, MyHttpFactory(), interface=local_hostname)
注意:你只能绑定在15000到35530这个端口范围内。