在 Elastic-Beanstalk Worker 上运行 Flask 端口 80

Posted

技术标签:

【中文标题】在 Elastic-Beanstalk Worker 上运行 Flask 端口 80【英文标题】:Running Flask port 80 on Elastic-Beanstalk Worker 【发布时间】:2019-02-16 00:49:44 【问题描述】:

给定一个 AWS Elastic-Beanstalk Worker 框,是否可以使用 Flask/port:80 来处理来自相关 SQS 队列的消息?

我在 ELB 工作人员内部看到了关于正在发生的事情的相互矛盾的信息。 ELB Worker Environment 页面说:

Elastic Beanstalk 通过管理 Amazon SQS 队列并在为您从队列中读取数据的每个实例上运行守护进程来简化此过程。当守护程序从队列中拉取项目时,它会在本地向端口 80 上的http://localhost/ 发送 HTTP POST 请求,其中包含正文中队列消息的内容。您的应用程序需要做的就是执行长时间运行的任务以响应 POST。

这个 SO 问题Differences in Web-server versus Worker 说:

我认为最重要的区别是工作层实例不运行 Web 服务器进程(apache、nginx 等)。

基于此,我希望我可以在端口 80 上运行一个 Flask-server,它会处理 SQS 消息。但是,该帖子似乎不正确。甚至 ELB-worker 机器上也运行着 Apache,显然是为了进行健康检查(当我停止它时,我的服务器变红了)。当然它使用的是 80 端口...

我已经在尝试迁移到 ELB 的 EC2 服务器上安装了 Flask/Gunicorn,我想继续使用它 - 可以吗? (注意:queue-daemon 只向端口 80 发送消息,不能更改...)

文档不清楚,但听起来他们希望您修改 Apache 以代理到 Flask,也许吧?我希望这不是唯一的方法。

或者,设置 ELB-worker 来处理 SQS 消息的“正确”方式是什么?你应该如何“执行长时间运行的任务”?

注意:现在我已经更多地使用 ELB,并且对它有了相当好的理解 - 让我明确指出,这不是的用例亚马逊为 ELB-workers 设计了,它有一些小故障(将被指出)。基本上,标准用例是您创建一个简单的 Flask 应用程序,并将其连接到 ELB-EC2 服务器,该服务器被配置为简化运行该 Flask 应用程序。

我的用例是,我已经有一个带有大型 Flask 应用程序的 EC2 服务器,在 gunicorn 下运行,以及其他各种事情。我想使用该服务器(作为图像)来构建 ELB 服务器,并让它响应 SQS 队列消息。可能有更好的解决方案,比如只写一个队列轮询守护进程,而且没有其他人会选择这个选项,但它就是......

【问题讨论】:

【参考方案1】:

ELB 工作器通过监听该队列的守护程序连接到 SQS 队列,并(在内部)将任何消息发布到 http://localhost:80。 Apache 正在侦听端口 80。这是为了处理健康检查,这些检查由 ELB 管理器(或生态系统中的某物)完成。 Apache 使用 mod_wsgi 将非健康检查请求传递给已上传的 Flask 应用程序,该应用程序位于:

/opt/python/current/app/application.py

我怀疑移除 Apache 并以其他方式(flask)处理运行状况检查是可能的,但很难,从而释放端口 80。但这已经足够改变,我认为不值得。

所以我找到的解决方案是更改本地守护程序发布到的端口 - 通过通过 YAML 配置文件重新配置它,它将发布到运行我的 Flask 应用程序的端口 5001。这意味着 Apache 可以继续处理端口 80 上的健康检查,而 Flask 可以处理来自守护进程的 SQS 消息。

您配置守护程序,并停止/启动它(以 root 身份):

/etc/aws-sqsd.d/default.yaml
/opt/elasticbeanstalk/addons/sqsd/hooks/stop-sqsd.sh
/opt/elasticbeanstalk/addons/sqsd/hooks/start-sqsd.sh
/opt/elasticbeanstalk/addons/sqsd/hooks/restart-sqsd.sh

实际的守护进程:

/opt/elasticbeanstalk/lib/ruby/bin/aws-sqsd
/opt/elasticbeanstalk/lib/ruby/lib/ruby/gems/2.2.0/gems/aws-sqsd-2.3/bin/aws-sqsd

故障: 如果您曾经使用 ELB GUI 配置守护程序选项,它将覆盖配置文件,您将不得不重新编辑端口(并重新启动守护程序)。

注意:所有的 HTTP 流量都是内部的,无论是 ELB 生态系统还是 Worker - 所以可以关闭所有外部端口(我保持 22 开放),例如端口 80。否则你的 Worker 有Apache 回复 http://:80 的帖子,这意味着它对世界开放。我假设服务器的配置相当安全,但端口 80 根本不需要打开,用于运行状况检查或其他任何事情。

【讨论】:

以上是关于在 Elastic-Beanstalk Worker 上运行 Flask 端口 80的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS elastic-beanstalk 中更改我的 python 版本

让 django celery worker 在 elastic-beanstalk 上启动的问题

在 Elastic-Beanstalk Worker 上运行 Flask 端口 80

使用 EbCommands 部署 Laravel Aws Elastic-Beanstalk

为啥我的 ec2-instance 被 elastic-beanstalk 终止?

Django AWS Elastic-Beanstalk WSGI.py 配置