在OpenShift上DIY龙卷风时的套接字错误

1 投票
2 回答
707 浏览
提问于 2025-04-18 04:21

我尝试在openshift的DIY环境中自己部署一个tornado,但遇到了一些问题。

我安装了python 2.7.6和tornado 3.2,并试图运行tornado的hello world示例。但总是出错。此外,我已经对$OPENSHIFT_REPO_DIR/diy执行了chmod 777的指令。

下面是我所做的事情和错误日志。我该如何解决这个问题并启动我的应用程序呢?

1. 预安装:

  1. 在$OPENSHIFT_DATA_DIR中安装python 2.7.6
  2. 通过pip安装tornado 3.2

2. tornado代码

这个名为start.py的文件是$OPENSHIFT_REPO_DIR/diy中唯一的文件。

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8080)
    tornado.ioloop.IOLoop.instance().start()

3. action_hooks文件:

启动:

nohup $OPENSHIFT_DATA_DIR/bin/python $OPENSHIFT_REPO_DIR/diy/start.py > $OPENSHIFT_DIY_LOG_DIR/tornado_server.log 2>&1 &

停止:

source $OPENSHIFT_CARTRIDGE_SDK_BASH

if [ -z "$(ps -ef | grep start.py | grep -v grep)" ]
then
    client_result "Application is already stopped"
else
    kill `ps -ef | grep start.py | grep -v grep | awk '{ print $2 }'` 
    > /dev/null 2>&1
fi

4. 日志

Traceback (most recent call last):
  File ".../app-root/runtime/repo//diy/start.py",
line 13, in <module>
    application.listen(8080)
  File ".../app-root/data/lib/python2.7/site-packages/tornado/web.py",
line 1559, in listen
    server.listen(port, address)
  File ".../app-root/data/lib/python2.7/site-packages/tornado/tcpserver.py",
line 117, in listen
    sockets = bind_sockets(port, address=address)
  File ".../app-root/data/lib/python2.7/site-packages/tornado/netutil.py",
line 104, in bind_sockets
    sock.bind(sockaddr)
  File ".../app-root/data/lib/python2.7/socket.py",
line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 13] Permission denied

2 个回答

1

你不一定要使用自己动手做的卡匣(DIY cartridge)来在Openshift上部署Tornado。

可以看看这个示例库:https://github.com/avinassh/openshift-tornado-starter

2

这样做是行不通的,因为你需要绑定到 $OPENSHIFT_DIY_IP 和 $OPENSHIFT_DIY_PORT。不要使用 application.listen(8080),而是用下面的代码

ip   = os.environ['OPENSHIFT_DIY_IP']
port = int(os.environ['OPENSHIFT_DIY_PORT'])
application.listen(port , ip)

另外,我写了一篇博客,可能对你有帮助,链接在这里 https://www.openshift.com/blogs/day-25-tornado-combining-tornado-mongodb-and-angularjs-to-build-an-app

撰写回答