1. ホーム
  2. パイソン

[解決済み】Flaskを80番ポートで動作させるには?

2022-03-30 09:23:12

質問

Flaskのサーバーを5000番ポートで動かしているのですが、問題ありません。以下のサイトでアクセスできます。 http://example.com:5000

しかし、単純に以下の場所でアクセスすることは可能なのでしょうか? http://example.com ? ポートを5000から80に変更しろってことだと思うんだけど。しかし、Flaskでそれを試すと、実行時にこのようなエラーメッセージが表示されます。

Traceback (most recent call last):
  File "xxxxxx.py", line 31, in <module>
app.run(host="0.0.0.0", port=int("80"), debug=True)
   File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 772, in run
run_simple(host, port, self, **options)
  File "/usr/local/lib/python2.6/dist-packages/werkzeug/serving.py", line 706, in run_simple
    test_socket.bind((hostname, port))
  File "<string>", line 1, in bind
socket.error: [Errno 98] Address already in use

実行中 lsof -i :80 リターン

COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
apache2   467     root    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2  4413 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14346 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14570 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14571 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14573 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)

これらのプロセスを最初に終了させる必要があるのでしょうか?それは安全ですか?または、ポート5000でFlaskを実行したまま、メインウェブサイトのドメインを何らかの方法でリダイレクトさせる別の方法がありますか?

解決方法は?

というエラーメッセージが表示されます。 apache2 がポート 80 で実行されています。

開発用であれば、そのまま5000番ポートで放置しておけばいいと思います。

本番用でもあれば

推奨しない

  • 停止 apache2 を最初に表示します。

ドキュメントに記載されているように、推奨されません。

開発時にはビルトインサーバーを使用できますが、本番アプリケーションではフルデプロイメントオプションを使用する必要があります。(ビルトインの開発用サーバーを実稼働環境で使用しないでください)。

おすすめ

  • プロキシ HTTP トラフィックを apache2 をFlaskに送信します。

こちらです。 apache2 は、すべての静的ファイルを処理し (これは非常に得意です。Flask に組み込まれたデバッグサーバーよりもはるかに優れています)、動的コンテンツのリバースプロキシとして動作し、それらのリクエストを Flask に渡します。

以下はリンクです。 は、Flask と Apache + mod_wsgi のセットアップに関する公式ドキュメントを参照してください。

編集 1 - @Djack のための明確化

<ブロッククオート

Flask への HTTP トラフィックを apache2 経由でプロキシします。

80番ポートでサーバーにリクエストが来た場合( HTTP )またはポート443( HTTPS ) ApacheやNginxのようなウェブサーバーはリクエストの接続を処理し、それをどう処理するかを考える。私たちの場合、受け取ったリクエストはWSGIプロトコル上でFlaskに渡され、Pythonコードによって処理されるように設定されるべきです。これがquot;dynamic"の部分です。

<ブロッククオート

ダイナミックコンテンツ用リバースプロキシ

上記のようにWebサーバーを設定することで、いくつかのメリットがあります。

  • SSLターミネーション - ウェブサーバーは、わずかな設定でHTTPSリクエストを処理するように最適化されます。おそらく比較的に非常に安全でないPythonで、"roll your own"をしないでください。
  • セキュリティ - インターネットにポートを開くには、セキュリティについて慎重に検討する必要があります。Flaskの開発サーバはこのために設計されたものではないので、この目的のために設計されたWebサーバと比較すると、バグやセキュリティの問題が開いている可能性があります。また、Webサーバーの設定が悪いと、安全でない可能性があります。
  • Nginx/Apache は画像、CSS、Javascript などの静的ファイルをより効率的に処理し、Python コードが処理するのは "dynamic" リクエスト(データベースからの読み込みやコンテンツの変更が多いもの)だけになります。
  • +more。これは、この質問の範囲の境界線です。もしもっと情報が欲しいなら、この分野について研究してください。