Flaskをポート80で実行するにはどうすればよいですか?


212

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)

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


apacheフラスコを使用できます。
Syed Habib M

3
質問のタイトルが質問に合いません。おそらく、「ポート80で他のものを実行しないようにする方法」を読んでください。私は、ポートフラスコが実行されているポートフラスコを変更する方法に興味があります。これはこの質問が尋ねるものですが、ここまでの方法については言及されていません
Elliot Woods

回答:


76

したがってapache2、ポート80で実行しているため、このエラーメッセージがスローされます。

これが開発用であれば、ポート5000のままにしておくだけです。

本番用の場合:

非推奨

  • apache2最初に停止します。

ドキュメントに記載されているため、お勧めしません:

開発中に組み込みサーバーを使用できますが、実動アプリケーションには完全なデプロイメントオプションを使用する必要があります。(組み込みの開発サーバーを本番環境で使用しないでください。)

オススメ

  • FlaskへのプロキシHTTPトラフィックapache2

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

Apache + mod_wsgiでFlaskを設定することに関する公式ドキュメントへのリンクは次のとおりです。

編集1-@Djackの説明

apache2を介してFlaskへのHTTPトラフィックをプロキシする

リクエストがポート80(HTTP)またはポート443(HTTPS)でサーバーに到着すると、ApacheやNginxなどのWebサーバーがリクエストの接続を処理し、それを使って何をすべきかを判断します。私たちの場合、受け取ったリクエストは、WSGIプロトコルでFlaskに渡され、Pythonコードによって処理されるように構成する必要があります。これは「ダイナミック」な部分です。

動的コンテンツのリバースプロキシ

上記のようにWebサーバーを設定することにはいくつかの利点があります。

  • SSL終了-Webサーバーは、ほんの少しの構成でHTTPS要求を処理するように最適化されます。おそらく比較して非常に安全ではないPythonで「自分でロール」しないでください。
  • セキュリティ-インターネットへのポートを開くには、セキュリティを慎重に検討する必要があります。Flaskの開発サーバーはこのために設計されておらず、この目的のために設計されたWebサーバーと比較して、未解決のバグやセキュリティの問題がある可能性があります。不適切に構成されたWebサーバーも安全でない可能性があることに注意してください!
  • 静的ファイルの処理-組み込みのFlask Webサーバーが静的ファイルを処理することは可能ですが、これはお勧めできません。Nginx / Apacheは、画像、CSS、JavaScriptファイルなどの静的ファイルの処理がはるかに効率的であり、Pythonコードで処理される「動的」リクエスト(コンテンツがデータベースから頻繁に読み取られるか、コンテンツの変更)のみを渡します。
  • +もっと。これは、この質問の範囲に隣接しています。詳細情報が必要な場合は、この領域について調査してください。

それは確かに素晴らしい答えです!「Proxy HTTP traffic to Flask through apache2」と「reverse proxy for dynamic content」を使用した高度に専門的な専門用語をわかりやすい英語で説明できますか?
ジョンストラウド2016年

2
@Djack-更新された回答ですが、質問の範囲に近いため、詳細についてはオンラインで検索してください。
ユアン

1
キーワードを提供していただきありがとうございます。きっとオンラインで検索していきます。
John Strood、2016年

419

1-ポート80を使用している他のアプリケーションを停止します。2-ポート80でアプリケーションを実行します。

if __name__ == '__main__':
      app.run(host='0.0.0.0', port=80)

1
apacheが存在しない場合、Windows環境でのみ正常に動作します。.::)
jOSe

1
それは私のために働いていません。フラスコの実行--host = 0.0.0.0
Harun-Ur-Rashid

1
@jOSe UbuntuでPyCharmを使用してみましたが、うまく機能します。
Bugs Buggy 2018

Linuxを実行するために@jOSe Apacheは必要ありません。アンインストールするか、ポートを変更できます。
ヌレティン

145

apacheや他のWebサーバーを使用しない、外部から見えるサーバーの場合

flask run --host=0.0.0.0 --port=80

このコマンドは環境変数を利用して実行できますか?私はCMD flask run --host=0.0.0.0 --port=$PORT(herokuの理由で)Dockerfile内で試行を続け、ポートに整数が必要であることに関するエラーが発生し続けます
Smokin Joe

これは私のローカル(ラップトップ)では問題なく機能しましたが、AWS EC2インスタンスで使用すると、「Permission Denied」と表示されます。最初に「sudo」を追加すると、「flask」コマンドが認識されないという
メッセージ

1
@ user3768495多分フラスコがルート(sudo)ユーザーにインストールされていない
Harun-Ur-Rashid

2
こんにちは@ Harun-Ur-Rashidです。たぶんそうです。仮想環境にインストールしました。修正方法を確認します。お返事をありがとうございます。
user3768495

22

以下を使用してポートまたはホストを変更する場合:

if __name__ == '__main__':
  app.run(host='0.0.0.0', port=80)

次のコードを使用してサーバーを起動します(私のフラスコのメインの入り口はapp.pyです)。

python app.py

使用する代わりに:

flask run

10

同じポート、つまりport = 5000でアプリケーションが必要な場合は、ターミナルで次のコマンドを実行します。

fuser -k 5000/tcp

次に実行します:

python app.py

特定のポートで実行したい場合、たとえば、port = 80で実行したい場合、メインファイルで次のように記述します。

if __name__ == '__main__':  
    app.run(host='0.0.0.0', port=80)

8

便利な方法は、パッケージを使用することです。フラスコの環境変数を保存できるファイルをpython-dotenv読み取り.flaskenvます。

  • pip install python-dotenv
  • .flaskenvアプリのルートディレクトリにファイルを作成する

指定するファイル内:

FLASK_APP=application.py
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=80

その後、アプリを実行するだけflask runで、そのポートでアプリにアクセスできます。

FLASK_RUN_HOSTデフォルトで127.0.0.1、はFLASK_RUN_PORTデフォルトであることに注意してください5000


8

これは私にとってUbuntu-18で機能した唯一のソリューションです。

ファイル内でapp.py、以下を使用します。

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

上記のコードは、sudoそれを実行するために使用されない限り、同じ権限エラーを与えます:

sudo python3 app.py

6

あなたの問題は、すでにポート80を使用しているApache Webサーバーがすでに実行されていることです。したがって、次のいずれかを行うことができます。

  1. Apacheを殺す:/etc/init.d/apache2 stop単に殺すのではなく、おそらくを介してこれを行うべきです。

  2. Apacheのフラスコが説明するように、Apacheプロセスにフラスコアプリをデプロイします。


5

FLASK_RUN_PORT私の環境では、指定されたポート番号に設定する必要がありました。次回アプリを起動すると、Flaskは選択したポート番号を使用してその環境変数を読み込みます。


3

アプリケーションのポート番号を変更する必要はありません。wwwサーバー(nginxまたはapache)を構成して、フラスコポートにクエリをプロキシします。に注意を払いuWSGIます。


3

app.run(port=80,debug=True) devのときにdebugをtrueに設定する必要があるポートを設定します


2

最も簡単で最適なソリューション

.pyファイルをフォルダーに保存します。この場合、私のフォルダ名はtestです。コマンドプロンプトで次を実行します。

c:\test> set FLASK_APP=application.py
c:\test> set FLASK_RUN_PORT=8000
c:\test> flask run

-----------------以下が返却されます----------------

 * Serving Flask app "application.py"
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)
127.0.0.1 - - [23/Aug/2019 09:40:04] "[37mGET / HTTP/1.1[0m" 200 -
127.0.0.1 - - [23/Aug/2019 09:40:04] "[33mGET /favicon.ico HTTP/1.1[0m" 404 -

次に、ブラウザーでhttp://127.0.0.1:8000と入力します。ありがとう


彼は特別なポートである80で実行する必要があります。彼は最初に他のものを止める必要があります。
Ahmedn1

1

私のシナリオでは、次の手順が魅力的に機能しました。

  • パッケージのインストール:

    pip install --upgrade pip
    pip install python-dotenv
  • アプリディレクトリ「flaskr / .flaskenv」に隠しファイルを作成する

  • 次のコンテンツを追加します。

    FLASK_APP=flaskr
    FLASK_RUN_HOST=localhost
    FLASK_RUN_PORT=8000
  • 最後に、フラスココマンドをもう一度実行します。

    flask run
  • 私が取り組んでいるバージョンは次のとおりです:

    pip freeze |grep -i flask
    Flask==1.1.1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.