web-dev-qa-db-ja.com

Flaskを80番ポートで動かすにはどうすればいいですか?

Flaskサーバーをポート5000経由で実行していますが、問題ありません。私はそれにアクセスすることができます http://example.com:5000

しかし、それに単に http://example.com でアクセスすることは可能ですか?それは私が5000から80にポートを変更しなければならないことを意味していると思っています。

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サイトドメインに何らかの方法でリダイレクトさせる方法はありますか。

155
quantumtremor

そのため、ポート80でApache2が実行されているため、このエラーメッセージが表示されます。

これが開発用であれば、ポート5000にあるのでそのままにします。

生産用の場合

お勧めしません

  • 最初にApache2を停止してください。

ドキュメントに記載されているのでお勧めできません。

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

おすすめ

  • Apache2を介してFlaskへのHTTPトラフィックを代理処理します。

このようにして、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コードによって処理される「動的な」要求(コンテンツがデータベースから読み取られるかコンテンツの変更が多い場合)のみを渡します。
  • もっと見るこれはこの質問の範囲に隣接しています。あなたがより多くの情報が欲しいならば、この分野に関していくらかの研究をしなさい。
57
Ewan

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

if __== '__main__':
      app.run(Host='0.0.0.0', port=80)
337
Amir Mofakhar

Apacheや他のWebサーバーを使用していない外部から見えるサーバーの場合は、単に入力するだけです。

flask run --Host=0.0.0.0 --port=80
97
Harun-Ur-Rashid

以下を使用してポートまたはホストを変更するとします。

if __== '__main__':
  app.run(Host='0.0.0.0', port=80)

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

python app.py

代わりに:

flask run
12
muca

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

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

  2. Apacheの flask で説明されているように、あなたのApacheプロセスにflaskアプリをデプロイします。

6
sebastian

アプリケーションを同じポート、つまりport = 5000にしたい場合は、端末でこのコマンドを実行してください。

fuser -k 5000/tcp

そして実行します。

python app.py

指定したポートで実行したい場合は、 port = 80で実行したい場合は、メインファイルに次のように記述してください。

if __== '__main__':  
    app.run(Host='0.0.0.0', port=80)
5
Alok Singh

アプリケーションのポート番号を変更する必要はありません。フラスコポートへのクエリをプロキシするようにwwwサーバー(nginxまたはApache)を設定するだけです。 uWSGIに注意を払ってください。

3
greg

ポートをapp.run(port=80,debug=True)で設定します

3
valentine

自分の環境でFLASK_RUN_PORTを指定されたポート番号に設定しなければなりませんでした。アプリを起動したときに、必要なポートを選択しました。

2
cathaldcronin1

最も簡単で最良のソリューション

.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:80 。ありがとう

0

80でアプリを起動できません。5000で正常に起動します。 Apacheが実行されていませんか?他に何を確認できますか? 80で実行したいので、ポートを指定せずにURLを使用できます。

>     server.run(debug=False, Host=args.Host, port=args.port)   File "/home/ryanicky/.local/lib/python3.6/site-packages/flask/app.py", line
> 944, in run
>     run_simple(Host, port, self, **options)   File "/home/ryanicky/.local/lib/python3.6/site-packages/werkzeug/serving.py",
> line 1009, in run_simple
>     inner()   File "/home/ryanicky/.local/lib/python3.6/site-packages/werkzeug/serving.py",
> line 962, in inner
>     fd=fd,   File "/home/ryanicky/.local/lib/python3.6/site-packages/werkzeug/serving.py",
> line 805, in make_server
>     Host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd   File
> "/home/ryanicky/.local/lib/python3.6/site-packages/werkzeug/serving.py",
> line 698, in __init__
>     HTTPServer.__init__(self, server_address, handler)   File "/usr/lib64/python3.6/socketserver.py", line 456, in __init__
>     self.server_bind()   File "/usr/lib64/python3.6/http/server.py", line 136, in server_bind
>     socketserver.TCPServer.server_bind(self)   File "/usr/lib64/python3.6/socketserver.py", line 470, in server_bind
>     self.socket.bind(self.server_address) OSError: [Errno 98] Address already in use [ryanicky@webstr WebSTR]$ systemctl status httpd Unit
> httpd.service could not be found.
0
user2945234