【问题标题】:Flask application cannot be exposed on dropletFlask 应用程序不能暴露在 Droplet 上
【发布时间】:2018-07-05 20:35:27
【问题描述】:

我正在将烧瓶服务器部署到 Digital Ocean 液滴。

from flask import Flask

app = Flask(__name__)

@app.route("/a/<string:b>")
def deploy(b):
    return "Response"

使用以下命令:

FLASK_APP=server.py python -m flask run --host=0.0.0.0 --port=5555

当我在本地部署应用程序时,我可以通过这样做来接收响应

curl -XGET localhost:5555/a/random

在 droplet 上部署时,它在内部工作,但在外部调用 droplet 时(尽管在 TCP 上暴露了 5555 端口),它不会连接。

有什么可以改变的?我还通过docker在同一个droplet上部署了flask graphql服务器,效果很好。

【问题讨论】:

  • 你用什么命令暴露了 5555/tcp 端口?
  • netstat -nltp 的输出是什么?您是否启用或运行了 DigitalOcean 防火墙? ufw 在液滴上?如果是,ufw status 的输出是什么?
  • 我已经通过 Web 界面暴露了端口。同样的方法适用于不同端口上的 flask_graphql 服务器。我将运行您建议的命令并稍后报告!
  • 这是来自 netstat 的输出:活动 Internet 连接(仅限服务器) Proto Recv-Q Send-Q 本地地址外部地址状态 PID/程序名称 tcp 0 0 0.0.0.0:5555 0.0.0.0: * 听 3971/python3
  • @Oliver - netstat 输出见上文

标签: python flask digital-ocean


【解决方案1】:

这可能是使用 VPS 时的常见问题。 如果代码正确,像我这样的人可能经常忘记设置防火墙

您提到它在本地有效,但在外部无效。我想应该是的。

数字海平面:

  • 在 Droplet 防火墙设置中添加入站 TCP 端口 5555

系统级

  • iptables:例如iptables -A INPUT -p tcp -dport 5555 -j ACCEPT
  • 防火墙:例如firewall-cmd --permanent --zone=public --add-port=5555/tcp

或者您可以通过systemctl stop [service-name]service [service-name] stop 禁用操作系统防火墙。你可以google命令。

【讨论】:

  • 我已经在 Digital Ocean 中设置了防火墙。使用 Docker 时,不需要在机器上启用额外的防火墙,你能确认除了 docker 设置之外还需要这个吗?
  • 嗯,我不确定 docker 是否需要在主机上设置防火墙。我记得 docker 会为连接创建一个桥接适配器。但我没有深入研究它是否需要防火墙设置。此外,“docker start”需要“-p 5555:5555”参数来映射容器端口到主机端口。
  • 我查看了这篇文章 [docs.docker.com/network/iptables]。看起来 docker 会自动向 iptables 添加规则,这样用户就不需要自己添加规则了。对于其他操作系统级别的防火墙,例如 firewalld 等,我不确定 docker 是否可以自动设置规则。但是在数字海洋层面,我想你仍然需要打开端口,这样流量可能会像这样:“容器端口 5555”->“主机端口 5555”->“数字海洋防火墙 5555”
  • 修复一个问题。我提到了“docker start”,应该是“docker run”
  • 从此“我还通过docker在同一个droplet上部署了flask graphql服务器,效果很好。”,我认为您在Digital Ocean上打开了端口,但没有在系统防火墙中打开(s )。由于 docker 会自动为 iptables 添加规则,所以它可以工作。没有 docker,端口不会打开。我们可以尝试简单地禁用系统防火墙以检查它是否有效。
【解决方案2】:

Flask 默认接受来自 localhost 的连接。

为了使您的 Flask 应用程序公开可用,您必须通过添加 --host=0.0.0.0 参数将其绑定到 0.0.0.0 地址。

外部可见服务器

如果你运行服务器,你会注意到 服务器只能从您自己的计算机访问,而不是从任何 网络中的其他。这是默认设置,因为在调试模式下 该应用程序的用户可以在您的应用程序上执行任意 Python 代码 电脑。

如果您禁用了调试器或信任网络上的用户, 您只需添加即可使服务器公开可用 --host=0.0.0.0 到命令行:

flask run --host=0.0.0.0 这告诉你的操作系统监听 所有公共 IP。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 2020-08-06
    • 2018-06-15
    • 2021-08-02
    • 1970-01-01
    • 2017-07-04
    • 2021-07-16
    相关资源
    最近更新 更多