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サイトドメインに何らかの方法でリダイレクトさせる方法はありますか。
そのため、ポート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サーバーを設定することにはいくつかの利点があります。
1-ポート80を使用している他のアプリケーションを停止します。2-ポート80でアプリケーションを実行します。
if __== '__main__':
app.run(Host='0.0.0.0', port=80)
Apacheや他のWebサーバーを使用していない外部から見えるサーバーの場合は、単に入力するだけです。
flask run --Host=0.0.0.0 --port=80
以下を使用してポートまたはホストを変更するとします。
if __== '__main__':
app.run(Host='0.0.0.0', port=80)
次のコードを使用してサーバーを起動します(flaskのメインの入り口はapp.pyです)。
python app.py
代わりに:
flask run
あなたの問題は、すでにポート80を使用しているApache Webサーバーがすでに実行されているということです。
Apacheを強制終了する:単にそれらを強制終了するのではなく、おそらく/etc/init.d/Apache2 stop
を介してこれを行うべきです。
Apacheの flask で説明されているように、あなたのApacheプロセスにflaskアプリをデプロイします。
アプリケーションを同じポート、つまりport = 5000にしたい場合は、端末でこのコマンドを実行してください。
fuser -k 5000/tcp
そして実行します。
python app.py
指定したポートで実行したい場合は、 port = 80で実行したい場合は、メインファイルに次のように記述してください。
if __== '__main__':
app.run(Host='0.0.0.0', port=80)
アプリケーションのポート番号を変更する必要はありません。フラスコポートへのクエリをプロキシするようにwwwサーバー(nginxまたはApache)を設定するだけです。 uWSGI
に注意を払ってください。
ポートをapp.run(port=80,debug=True)
で設定します
自分の環境でFLASK_RUN_PORT
を指定されたポート番号に設定しなければなりませんでした。アプリを起動したときに、必要なポートを選択しました。
最も簡単で最良のソリューション
.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 。ありがとう
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.