gunicorn で Flask アプリを実行するときに app.wsgi_app = ProxyFix(app.wsgi_app) を設定すると何が起こりますか? 質問する

gunicorn で Flask アプリを実行するときに app.wsgi_app = ProxyFix(app.wsgi_app) を設定すると何が起こりますか? 質問する

Flaskを使用して基本的なWebアプリを作成し、ネイティブのhttpサーバーを使用して仮想マシンから実行できました。この設定では、リクエストがブロックされていることにすぐに気付きました(リソースの同時リクエストができず、新しいリクエストは前のリクエストが終了するまで待機します)。この問題を解決するために、gunicornを使用してアプリを実行することにしました。ドキュメンテーション具体的には次の行で実行します:

gunicorn -w 4 -b 127.0.0.1:4000 myproject:app 

しかし、これだけでは起動に失敗し、WSGI アプリがないというエラーが表示されました。インターネットで調べてみると、次のような例を投稿している人が何人かいました。

from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)

それを追加したら、問題は解決しました。しかし、これはどうやら HTTP プロキシの背後でサービスを提供する際の問題を解決することを意図しているようですが、gunicorn を追加すると HTTP プロキシが強制されるのでしょうか? それとも、常にプロキシの背後にいて、Flask の組み込みサーバーでは問題にならないだけなのでしょうか?

また、Werkzeug の Fixers に関するドキュメント「セキュリティ上の理由から、このミドルウェアを非プロキシ設定で使用しないでください。」と警告しています。修正が明らかに必要であったことを考慮すると、プロキシ設定を使用していると想定してよいでしょうか?

ベストアンサー1

少し遅れましたが、こちら (Flask v1)ProxyFix に関するドキュメントにはこう書かれています。

v2のドキュメント

言い換えると、HTTP プロキシの背後で gunicorn を使用してサーバーを展開する場合、アプリケーションが動作できるようにヘッダーの一部を書き換える必要があります。また、Werkzeug には、一般的な設定の一部を解決する修正プログラムが付属しています。

from werkzeug.middleware.proxy_fix import ProxyFix

app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)

おすすめ記事