如何简单地在OpenShift上部署Twisted服务器

1 投票
1 回答
881 浏览
提问于 2025-04-18 07:00

我已经设置好了正确的环境,使用的是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 个回答

0

根据知识库的说明:

请注意:我们不允许在外部可访问的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这个端口范围内。

撰写回答