私はUbuntu 18.04を使用するDigital Ocean 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
私の質問:
私の端末ではアプリが正常に動作しているようですが、ブラウザがURLにアクセスしようとするとロードされません。
私にとって奇妙なことは、これら2つのコマンドを実行してアプリケーションを起動すると、非常に正常な出力が生成されることです。
(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(Google Chromeから)
典型的な「サイトにアクセスできないエラー」が表示されます。
また、端末は通知を受け取らず、私のフラスコアプリケーションは誰かがそれにアクセスしようとしているという事実を全く認識しません。
ただし、アプリケーションを次のように変更した場合:
[... 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繰り返しますが、Flaskアプリは私のブラウザがそれをロードしようとしているという事実を全く認識していないようです。
"sudo ufw allowed 5000"コマンドの出力は常に次のようになります。
Skipping adding existing rule
Skipping adding existing rule (v6)
この問題についてどのように進歩を遂げることができますか?
答え1
Dropletを削除して再起動して、この問題を正常に解決しました。正確に何が起こっているのかわかりませんが(おそらくファイアウォール構成エラーかもしれません)、インターネット上でこの問題を発見した場合は、すべてのコードとデータをバックアップして再起動することをお勧めします。最初の選択にならないのは簡単です。