web-dev-qa-db-ja.com

Google Cloud App Engine:Flask App)で502 Bad Gateway(nginx)エラー

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エラーの原因を特定するにはどうすればよいですか?

8
AaronDT

これが私の理論です:

  • localhost(_127.0.0.1_)が使用されています。 _0.0.0.0_を使用する必要があります
  • Flaskの内部WSGIサーバーが使用されています。たとえばを使用する必要があります Gunicorn

[〜#〜] nb [〜#〜]あなたmay CloudShellを使用してこれらのソリューションをテストします。 Cloud Shell(現在)には、Cloud Shellインスタンスで実行されているサーバーのエンドポイント(_:8080_を含む)の参照を許可する Webプレビュー 機能が含まれています。

Flask

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 -
_

例えば。 Gunicorn

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 Engine Flex

推奨される構成を使用すると、app.yamlには次のものが含まれます。

_runtime: python
env: flex
entrypoint: gunicorn --bind:$PORT main:app
_

Dockerfiles

これらは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"]
_
1
DazWilkin

同様の問題がありました。 AppEngineがmain.pyファイルでアプリ変数を検索することがわかりました。私の最終的なapp.yamlは次のようになります。

app.yaml

runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app

runtime_config:
 python_version: 3

以下のようなrequirements.txtがありました。

requirements.txt

Flask==1.1.1
gunicorn==20.0.4
1
radhikesh93