我有一个使用 ubuntu 18.04 的数字海洋 Droplet,并尝试按照本指南创建 Flask 应用程序并使用 Gunicorn + nginx 进行托管。
因此,在指南的最开始部分附近,您创建了一个示例 Flask 应用程序(名为 myproject.py):
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "<h1 style='color:blue'>Hello There!</h1>"
if __name__ == "__main__":
app.run(host='0.0.0.0')
然后,您可以通过执行以下操作来测试是否将其暴露在互联网上:
sudo ufw allow 5000
python myproject.py
我的问题:
该应用程序在我的终端中似乎运行良好,但当浏览器尝试访问该网址时它无法加载。
现在对我来说奇怪的是,如果我运行这两个命令并启动应用程序,它会产生非常正常的输出:
(myprojectenv) root@ubuntu-s-1vcpu-1gb-nyc1-01:/home/root/myproject# python myproject.py
* Serving Flask app "myproject" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
但是当我真正继续访问 URL 上的 Droplet 时:http://165.227.205.175:5000(在谷歌浏览器中)
我收到经典的“站点无法访问错误”:
此外,终端没有收到任何通知,我的烧瓶应用程序完全不知道有人试图访问它。
但是,如果我将应用程序更改为:
[... flask boilerplate ...]
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
然后运行:
sudo ufw allow 5000
python myproject.py
我可以看到该网站在以下位置可见: http://165.227.205.175!此外,Flask 应用程序清楚地生成日志(200 个请求...)然后再次稍微调整代码(因此我对端口号更加明确):
[... flask boilerplate ...]
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000)
再次运行命令:
sudo ufw allow 5000
python myproject.py
我现在在尝试加载时无法再次看到任何内容http://165.227.205.175再次,烧瓶应用程序似乎完全不知道我的浏览器尝试加载它。
“sudo ufw allowed 5000”命令的输出始终为:
Skipping adding existing rule
Skipping adding existing rule (v6)
我如何在这个问题上取得任何进展?
答案1
我通过销毁我的 Droplet 并重新启动成功解决了这个问题。我不确定到底发生了什么原因(可能是防火墙配置错误),但如果您从互联网上发现这个问题,我强烈建议您备份所有代码+数据,然后重新启动。很容易不成为您的第一选择。