【问题标题】:Deploying Tornado app on AWS Elastic Beanstalk在 AWS Elastic Beanstalk 上部署 Tornado 应用程序
【发布时间】:2017-08-01 23:58:05
【问题描述】:

我有一个用 Python 2.7/Tornado 编写的服务器,我正在尝试将它部署在 AWS 上。 我遇到了 AWS Elastic Beanstalk,这看起来是一种非常方便的方法来部署我的代码。

我通过了这个tutorial 并能够部署 Flask 示例应用程序。 但是,我不知道如何部署如下所示的测试龙卷风应用程序。

import tornado.web
import tornado.ioloop

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

if __name__ == "__main__":
    app = tornado.web.Application([
        (r"/.*", MainHandler),
    ])

    app.listen(5000)
    tornado.ioloop.IOLoop.current().start()

当我尝试部署上述应用程序时,我的所有请求都会导致错误 500,并且我不知道如何解决此问题,因为我不知道 Flask 示例是如何工作的,但 Tornado 代码却不是。

requirements.txt 文件中包含 tornado==4.4.2 的条目。

我尝试添加一些日志语句以写入外部文件,但没有创建文件,这可能意味着应用程序甚至没有启动。

如果有人能提供一些在 AWS-EB 上部署 Tornado 应用程序的步骤,或者我应该如何开始对此进行故障排除,那就太好了。 如果我需要提供更多详细信息,请告诉我。

谢谢!

更新

在注意到 httpd error_log 文件、AWS 文档和 Berislav Lopac 的回答中的错误后,我找到了实现 Tornado 服务器的正确方法。 这是一个简单的服务器

import tornado.web
import tornado.wsgi
import tornado.ioloop

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

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

# Wrapping the Tornado Application into a WSGI interface
# As per AWS EB requirements, the WSGI interface must be named
# 'application' only
application = tornado.wsgi.WSGIAdapter(webApp)

if __name__ == '__main__':
    # If testing the server locally, start on the specific port
    webApp.listen(8080)
    tornado.ioloop.IOLoop.current().start()

其他链接: Tornado WSGI Documentation

【问题讨论】:

  • 能否包含您用于本地测试的 docker 文件以及包含在 zip 中以上传到亚马逊的文件?如果你做了不同的事情,请解释一下。
  • @denson 这是一个旧的副项目,所以我不记得所有细节。我绝对没有 docker 参与其中。很可能它只是压缩整个 tornado 项目代码并在 UI 上手动上传。
  • 感谢您的快速回复。我想我的用例有所不同,因为我试图通过 conda 安装所有内容并将 Tornado 作为散景服务器运行。

标签: python amazon-web-services amazon-elastic-beanstalk tornado


【解决方案1】:

您可以使用 WSGI mod 部署 tornado 应用程序

import tornado.web
import tornado.wsgi

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

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

http://www.tornadoweb.org/en/stable/guide/running.html

【讨论】:

    【解决方案2】:

    我认为您的问题与 Elastic Beanstalk 使用 WSGI 为 Python Web 应用程序提供服务,而 Tornado 的服务器不符合 WSGI 的事实有关。在通过 WSGI 提供应用程序之前,您可能想尝试将应用程序包装在 WSGI adapter 中。

    这应该可以正常工作,除非您依赖 Tornado 的异步功能,因为 WSGI 是严格同步的。

    【讨论】:

    • 是的!感谢您的回复!我注意到 httpd error_log 中与 WSGI 相关的错误,并找到了与您的答案相匹配的解决方案。我还更新了问题中的工作服务器代码。
    猜你喜欢
    • 2018-09-13
    • 2012-09-24
    • 2018-06-16
    • 2016-01-24
    • 2015-07-06
    • 2013-08-05
    • 2017-09-28
    • 2020-04-29
    • 2017-05-11
    相关资源
    最近更新 更多