python - 如何远程访问在 AWS EC2 上运行的 Python 烧瓶应用程序?
问题描述
我有一个烧瓶应用程序,已克隆到我的 aws ec2 实例上。我只能使用虚拟环境运行它(我通过运行以下命令来激活它):
$ python3 -m venv venv
$ source venv/bin/activate
$ pip install --upgrade pip
$ pip install flask==1.1.1
下面是我的应用程序:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
执行时它运行得很好env FLASK_APP=app.py flask run
。问题是,我想使用我的 aws ec2 的公共 IP 或主机名远程访问公开的路由。每当我尝试访问它时,我都会收到一个 tiemout 错误。我认为这是因为我在虚拟环境中运行烧瓶应用程序,但我不确定。我找不到任何关于如何公开这个的好的教程。我在哪里错了?
解决方案
快速 n' 安全解决方案:
当您运行开发服务器时,它不适合生产。我想说从您自己的机器连接到这个应用程序的最佳方式是使用 ssh 隧道:
ssh -L 5000:localhost:5000 ec2_addr
然后,您可以将 Web 浏览器指向http://localhost:5000/
您的客户端计算机,该计算机将通过隧道连接到 EC2 实例上的端口 5000。这是连接到远程 Linux 机器上的 Flask(或任何)服务器的快速方法。当您停止该 ssh 会话时,隧道将被破坏。
更长的方法:
我想使用我的 aws ec2 的公共 IP 或主机名远程访问公开的路由。
超时不是因为它在虚拟环境中运行:您可能会发现它是因为您需要通过 EC2 控制台将安全组分配给您的实例。这些允许您打开公共 IP 上的某些端口。
请参阅我写的关于EC2 安全组的其他答案。
不过要小心。您不应该以这种方式公开开发服务器。有许多像这样的教程来自数字海洋,其中包括在后面部署一个烧瓶应用程序gunicorn
并nginx
使用Let's Encrypt
SSL 证书。您应该发现自己处于安全组公开端口 80 和 443 的位置,对端口 80 的请求被https
nginx 配置重定向到 URL。
如果这听起来很麻烦/您没有 Linux 技能/您不想学习 Linux 技能,那么这些是人们选择 AWS Elastic Beanstalk 等托管服务的常见原因,您可以在其中部署您的烧瓶应用程序(官方指南),无需担心服务器配置。Heroku 是提供此类功能的另一项(非 AWS)服务。
这实际上取决于您需要/希望获得什么。注意安全!
推荐阅读
- r - R bsplus 包:bs_tooltip 不适用于 Shiny 中的 dateRangeInput/dateInput
- node.js - 如何从 ejs.file 中获取输入值的正确方法
- lua - Lua简单的鼠标按下宏
- ssrs-2012 - 从本地系统报告 SSRS 服务器配置错误
- angular - 将http调用的“异步结果”分配给“For循环”中的对象
- java - 当类删除对关联表的引用时,如何从关联表中删除行?
- jhipster - 我的 application-dev.yml 中指定的端口 8180 在我的 debian 服务器上已关闭
- jquery - translateX css 悬停效果
- java - 如何从 Maven 插件访问 Maven 占位符?
- javascript - 数据表服务器端:具有所有选项的下拉过滤器?