web-dev-qa-db-ja.com

NodeJSを使用したGoogle App Engine 502(Bad Gateway)

NodeJS、MongoDB(ドライバーとしてMongoose)、ExpressJSを使用する完全なWebアプリケーションがあります。

プロジェクトは私のローカルマシンで完全に動作します。今日、私はすべてを本番環境に移行することを決定しました。 Google App Engineを使用してアプリケーションをホストし、Compose(以前はMongoHQ)を使用してデータベースをホストしています。

App Engineは私のアプリケーションを完全にサーバーしますが、私のAPIは機能していないようです。私のAPIはexample.com/api、および各リクエスト(GETPOSTDELETEおよびPUT)はすべて、502(不正なゲートウェイ)エラーを返します。

リモートのMongoDBデータベースに接続しているときに、ローカルマシンでアプリケーションを実行してみましたが、問題なく動作しました。したがって、MongoDBではなく、App EngineまたはNodeJSに問題があるはずです。

エラーはありませんが、Google Cloud内のすべてのエラーログを確認してみました。

App Engine/NodeJSがAPIへのリクエストを許可しないのに、アプリケーションの静的コンテンツを完璧に提供するのはなぜですか?

22
Fizzix

502 Bad Gatewayは通常、Nginx側のエラーです。残念ながら、これらのログはまだCloud Loggingに表示されていません。

多くの場合、問題は、HTTPパケットがバッファなどに対して大きすぎることです。 nginxログを表示する方法は次のようなものです。

  • VMを1つだけ使用します。これは厳密に必要なわけではありませんが、多くの場合、1台のマシンでの要求がわかっていると、アプリケーションのデバッグが容易になります。これをapp.yamlに追加することでこれを実現できます。

manual_scaling: instances: 1次に再デプロイ

  • VMを「Google所有」からセルフマネージドに切り替えます。これはCloud Consoleで実行できます。ComputeEngineのインスタンスに移動し、App Engineのバージョンと一致するインスタンス名をクリックします。これを自己管理に切り替えるオプションが表示されます。

  • gcloud compute ssh <instance name> SSHでマシンに

  • docker ps実行中のコンテナを確認します。 nginxという名前のコンテナを探し、そのIDを取得します。

  • コンテナIDを取得すると、docker exec -it <container id> -- cat /var/log/nginx/error.log。ログディレクトリ全体をlsしたい場合があります。

そこにエラーが表示される可能性が高く、これは何が悪いのかについてのより大きなヒントになります。

これは本来あるべきことよりもはるかに複雑であることを私は知っています:-\上記の手順に問題がある場合は、コメントを残してください。エラーを見つけて、どうすればよいかわからない場合は、コメントも残してください。

14
Bill Prin

サーバーが8080ポートでリッスンすることを確認してください https://cloud.google.com/appengine/docs/flexible/custom-runtimes/build#listen_to_port_808

27
Deepak Patil

同じ問題があり、GAE標準環境で「nginx 502 bad gateway」エラーが発生しました。これには多くの理由がありますが、ようやく機能しました。これらを試してください:

1)正しいポートでアプリを実行します。 GoogleはPORT環境変数を設定します。私はポート8080で実行しており、Stackdriverログで次の警告が表示されていました。

アプリはポート8080でリッスンしています。ポート8080でNGINXレイヤーを利用するには、PORT環境変数で定義されたポートでアプリをリッスンすることをお勧めします。

以下のコードは、PORTが設定されている場合、環境からポートを取得します。それ以外の場合、デフォルトは8080です。

const PORT = process.env.PORT || 8080;

2)google cloud console -> logging -> logs viewerにアクセスします。 Google App Engineを選択し、下からサービスを選択して、ログを確認します。リクエストをまったく受け取っていますか、それともリクエストがサーバーに反応しないように見えますか?私の場合、ポートを修正した後でもそれらを取得していませんでした:

2020-03-02 21:50:07バックエンド[20200302t232314]ポート8081でリッスンしているサーバー! 2020-03-02 21:50:08バックエンド[20200302t232314] "GET/create-user HTTP/1.1" 502

アプリケーションが起動に失敗したり、例外をスローしたりする場合は、エラーを修正してください。

3)サーバーを実行しているときは、IPを渡さないでください。 Googleは事前に定義されたIPアドレスでアプリを実行しており、変更を望まないようです。

server.listen(PORT);

4)httpsで実行しないでください! Googleはアプリの前でnginxサーバーを実行しており、SSLを処理してhttp経由でアプリにリダイレクトします。環境変数NODE_ENV(GAE環境では「本番」に設定されています)を使用して、次のように本番のhttpと他の場所のhttpsで実行できます。

let https = require('https');
let http = require('http');

if (process.env.NODE_ENV == "production") {
    http.createServer(app).listen(PORT, function () {
        console.log(`Server listening on port ${PORT}!`)
    });
} else {
    https.createServer({
        key: fs.readFileSync('Host.key'),
        cert: fs.readFileSync('Host.cert')
    }, app).listen(PORT, function () {
        console.log(`Server listening on port ${PORT}!`)
    });
}

5)yamlファイルにハンドラーを設定する必要はありませんでした。構成が正しくない場合、エラーが発生する可能性があります。私のyamlファイルはかなり単純です:

runtime: nodejs12
env: standard
instance_class: F1
1
Caner