NodeJS、MongoDB(ドライバーとしてMongoose)、ExpressJSを使用する完全なWebアプリケーションがあります。
プロジェクトは私のローカルマシンで完全に動作します。今日、私はすべてを本番環境に移行することを決定しました。 Google App Engineを使用してアプリケーションをホストし、Compose(以前はMongoHQ)を使用してデータベースをホストしています。
App Engineは私のアプリケーションを完全にサーバーしますが、私のAPIは機能していないようです。私のAPIはexample.com/api
、および各リクエスト(GET
、POST
、DELETE
およびPUT
)はすべて、502(不正なゲートウェイ)エラーを返します。
リモートのMongoDBデータベースに接続しているときに、ローカルマシンでアプリケーションを実行してみましたが、問題なく動作しました。したがって、MongoDBではなく、App EngineまたはNodeJSに問題があるはずです。
エラーはありませんが、Google Cloud内のすべてのエラーログを確認してみました。
App Engine/NodeJSがAPIへのリクエストを許可しないのに、アプリケーションの静的コンテンツを完璧に提供するのはなぜですか?
502 Bad Gatewayは通常、Nginx側のエラーです。残念ながら、これらのログはまだCloud Loggingに表示されていません。
多くの場合、問題は、HTTPパケットがバッファなどに対して大きすぎることです。 nginxログを表示する方法は次のようなものです。
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
したい場合があります。
そこにエラーが表示される可能性が高く、これは何が悪いのかについてのより大きなヒントになります。
これは本来あるべきことよりもはるかに複雑であることを私は知っています:-\上記の手順に問題がある場合は、コメントを残してください。エラーを見つけて、どうすればよいかわからない場合は、コメントも残してください。
サーバーが8080ポートでリッスンすることを確認してください https://cloud.google.com/appengine/docs/flexible/custom-runtimes/build#listen_to_port_808
同じ問題があり、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