Google Cloud App Engine(flex)でFlaskアプリを実行しています。ローカルで実行すると問題なく動作しますが、デプロイすると502 Bad Gateway error (nginx)
が得られます。これの原因を突き止めたいのですが、アプリが作成したコンソールログを表示するオプションが見つかりません。
ローカル環境では問題なく機能するため、この問題を解決するための現在のワークフローでは、コードをローカルに変更してデプロイし、後で機能するかどうかを確認しますが、各展開には30分以上かかり、まだ機能しないことがわかります。これをより効率的に行う方法が必要です。
ドキュメントに従う https://cloud.google.com/appengine/docs/flexible/python/debugging-an-instance デバッグモードでインスタンスにSSHで接続し、Flaskアプリですが、クラウドサーバーからはアクセスできない http://127.0.0.1:8080/ でアクセスするように指示されます。したがって、502エラーを再現してコンソールに出力を表示するために、Webページをナビゲートすることはできません。
サーバーで502エラーの原因を特定するにはどうすればよいですか?
これが私の理論です:
127.0.0.1
_)が使用されています。 _0.0.0.0
_を使用する必要があります[〜#〜] nb [〜#〜]あなたmay CloudShellを使用してこれらのソリューションをテストします。 Cloud Shell(現在)には、Cloud Shellインスタンスで実行されているサーバーのエンドポイント(_:8080
_を含む)の参照を許可する Webプレビュー 機能が含まれています。
Flaskには開発(WSGI)サーバーが含まれており、チュートリアルには通常次のものが含まれます。
_if __name__ == '__main__':
app.run(Host='127.0.0.1', port=8080, debug=True)
_
これは、_python somefile.py
_として実行すると、Flaskの組み込み(dev)サーバーを使用し、ローカルホスト(_127.0.0.1
_)で公開します。
これは他のマシンからはアクセスできません:
_ * Serving Flask app "main" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://127.0.0.1:8080/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 244-629-469
_
代わりに、_Host='0.0.0.0'
_が使用されている場合、これは機能します。
_ * Serving Flask app "main" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 244-629-469
192.168.9.1 - - [08/May/2019 23:59:59] "GET / HTTP/1.1" 200 -
192.168.9.1 - - [08/May/2019 23:59:59] "GET /favicon.ico HTTP/1.1" 404 -
_
Flaskの組み込みサーバーは使用しないでください。また、Flexのドキュメントには、gunicorn(さまざまな代替手段の1つ)の使用方法が記載されています。
https://cloud.google.com/appengine/docs/flexible/python/runtime#application_startup
これを実行すると、_gunicorn --bind=0.0.0.0:8080 main:app
_は次のようになります。
_[INFO] Starting gunicorn 19.9.0
[INFO] Listening at: http://0.0.0.0:8080 (1)
[INFO] Using worker: sync
[INFO] Booting worker with pid: 7
_
推奨される構成を使用すると、app.yamlには次のものが含まれます。
_runtime: python
env: flex
entrypoint: gunicorn --bind:$PORT main:app
_
これらはDockerfilesを使用してローカルでテストでき、必要に応じて、カスタムランタイムとしてFlexにデプロイできます(_app.yaml
_を改訂した後)。
_FROM python:3.7-Alpine
WORKDIR /app
ADD . .
RUN pip install -r requirements.txt
_
Flask add:
_ENTRYPOINT ["python","main.py"]
_
[〜#〜] nb [〜#〜]上記では、構成はsomefile.py app.run(...)
から行われます。
そしてgunicornの場合:
_ENTRYPOINT ["gunicorn","--bind=0.0.0.0:8080","main:app"]
_
同様の問題がありました。 AppEngineがmain.pyファイルでアプリ変数を検索することがわかりました。私の最終的なapp.yamlは次のようになります。
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app
runtime_config:
python_version: 3
以下のようなrequirements.txtがありました。
Flask==1.1.1
gunicorn==20.0.4