1. ホーム
  2. amazon-ec2

[解決済み] 504 Gateway Timeout - ロードバランサーを使用した2つのEC2インスタンス

2022-02-27 22:48:06

質問

これはありえない問題かもしれません。 いろいろと試してみたのですが どこかの配電盤でヒゲをクネクネさせている人がいるような気がします。

問題点は

Amazon EC2でアプリケーションを動かしています。 インスタンスが1つだけで、ロードバランサーがない場合は問題なく機能します。

しかし、私の本番環境では、1つのロードバランサーの後ろで2つの同じインスタンスが動作しています。PDFを生成してメールに添付する機能など、特定のタスクを実行すると、まったく何も起こりません。Google Developerツールのネットワークタブでは、タイムアウト(私は30秒に設定しています)に達するとエラー "504 Gateway Timeout" が発生しました。

私のデータベースは外部で、Amazon RDSにあります。

と思うのですが...。 もし、クライアントが最初にログインしたサーバーに強制的に接続し続けることができれば、この問題は解決します。私の理解では、504 Gateway Timeoutは、インスタンス-1がタスクを実行するためにインスタンス-2に連絡を取ろうとしたときに起こっているのです。

この現象はロードバランシングを使用しているときにのみ発生し、2つのサーバーのうちの1つに直接接続したときには発生しません。

ロードバランサーの設定。

  • ロードバランサーは私のレジストラにCRECORDを持ち、app.myapplication.comがmyloadbalancerDNSname.elb.amazonaws.comを指すようにします。
  • ロードバランサーには2つの健全なインスタンスがあり、それぞれ同じ地域にありますが、それらは異なるアベイラビリティゾーンにあります。
  • ロードバランサーは、インスタンスと同じセキュリティグループを使用しています(ポート22、80、443のすべてのIPを許可)。
  • ロードバランサーはクロスゾーンのロードバランシングをオンにしています。
  • CORS(アマゾンS3)は、*から*へのGET、POST、PUT、DELETEに有効です(これが私のインスタンスとどう関連しているのか見当もつきませんが、とにかく指示通りに実行しました)。
  • ロードバランサーには、このようにリスナーが設定されています。
    • ロードバランサープロトコル:HTTP ロードバランサポート:80 インスタンスプロトコル:HTTP インスタンスポート:80
    • ロードバランサープロトコル:HTTPS ロードバランサポート:443 インスタンスプロトコル:HTTP インスタンスポート:80 (暗号は証明書プロバイダーによって正しく選択され、SSLフィールドは100%確実に正しいです)

さらにいくつかのアイデアを紹介します。

とはいえ、HTTPSではなく、通常のHTTPでテストしているのですが。 証明書のプロバイダーがSSLが正しく設定されていると言ったにもかかわらず、私はSSLが正しく設定されていることに納得していません。 なぜ怪しいかというと、キー入力しようとすると https://app.myapplication.com Googleデベロッパーツールのネットワークタブで、"(failed) net::ERR_CONNECTION_CLOSED" というエラーが表示されるのですが、これは何ですか? しかし、これは通常のHTTPを使用しても問題が発生しているため、適用できないはずです。 SSL のトラブルシューティングは後ほど行います。

繰り返しになりますが、私の問題は、いくつかの関数を使用するときに "504 Gateway Timeout" の問題が発生することです。 この504の問題は、ロードバランシングを使用しているときにのみ発生し、2つのインスタンスのうちの1つに直接接続したときには発生しません。

というのも、私はすべてのドキュメントに忠実に従い、ウェブ上のすべての提案を二重三重にチェックしましたが、何もなかったからです。

どのように解決するのですか?

私の場合、ロードバランサーに問題がないことが判明しました。 最終的な解決策は、Ubuntuのhostsファイルに、謎のIPから私のアプリケーションのホスト名へトラフィックをルーティングするための不可解なエントリがあったことです。 そのため、PDFを作成する過程で、PDFジェネレーターによってパスが書き換えられ、謎のサーバーを指すようになり、その結果、ゲートウェイのタイムアウトの問題が発生したのです。 なぜ、時折動作し、失敗しないのか全くわかりません。

127.0.0.1 localhost
127.0.1.1 ubuntu-server
42.139.126.191 app.myapp.com

このような状態だったので、3行目を削除したら、すべての歯車が再び回り始めました :P