2

Elastic Beanstalk を使用してデプロイされ、単一の EC2 マイクロ インスタンスで実行される Amazon Web Services で実行されている Web サイトがあります。これはステージング環境であり、アクセスできるのは私だけです。Apache JMeter を使用して、Web サイトをナビゲートする 6 人のユーザーをシミュレートし、合計 3 秒ごとに約 1 つのリクエストを平均します (画像、CSS、JS、およびその他の静的リソースは CloudFront によって提供され、EC2 インスタンスではトラフィックを生成しません)。

問題は、しばらくすると (通常、環境がセットアップされてから 30 ~ 60 分)、Web サイトが応答しなくなることです。ログ (catalina.out) で cronjobs がまだ実行されていることを確認できるので、Tomcat はまだ適切に実行されていると確信しています。応答を提供できないのはELBだけのようです。

ログを分析すると、Tomcat にエラーはまったくありません (/opt/tomcat7/logs/tail_catalina.log または /opt/tomcat7/logs/catalina.out にはありません)。Web サイトにアクセスできなくなるとすぐに、次のエラーが /etc/httpd/logs/elasticbeanstalk-error_log に表示され始めます。

[Thu Jun 14 20:26:42 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:26:42 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:26:50 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:26:50 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:27:20 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:27:20 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:27:43 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:27:43 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:27:50 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:27:50 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:28:20 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:28:20 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:28:42 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:28:42 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:28:50 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:28:50 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:29:20 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:29:20 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:29:42 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:29:42 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:29:50 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:29:50 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:30:20 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:30:20 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:30:43 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:30:43 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:30:50 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:30:50 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:31:20 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:31:20 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:31:43 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:31:43 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:31:50 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:31:50 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Thu Jun 14 20:32:20 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:32:20 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)

... EC2 インスタンスが最終的に終了するまで (そして新しいインスタンスが自動的に開始されるまで)。

この問題は、リクエストをまったく行わない場合 (またはリクエストを減らす場合) には発生しません。

どんな助けでも大歓迎です。

ありがとう!

4

2 に答える 2

7

仮定から始めましょう:

  • Tomcat アプリケーションは 127.0.0.1:8999 でリッスンしているはずです

それが true の場合、ログ イベント:

[Thu Jun 14 20:26:42 2012] [error] (111)Connection refused: proxy: HTTP: attempt to   connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:26:42 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)

..アプリケーション リスナーが停止したことを示唆しています。これは次の方法で確認できます。

curl -v http://127.0.0.1:8999/

このcurlコマンドは、サイトが正常に動作している場合は有効な HTTP 応答を返す必要があり、停止が発生している場合はおそらくConnection refusedorを返します。couldn't connect to host次のコマンドを使用して、アプリケーション ポートで有効なリスナーを確認することもできます。

netstat -an | grep LISTEN | grep 8999

アプリケーション リスナーが停止する理由はいくつかありますが、これには次のようなものがあります。

  • JVM のハード クラッシュ ( psJVM プロセスがまだ実行されているかどうかを確認するために使用します)
  • アプリケーションのソフト クラッシュ (Tomcat アプリケーション ログを参照)
  • ファイル記述子の不足 (アプリケーション ユーザーの使用lsof | wc -lと比較)ulimit -n

ただし、ほとんどのエラーでは、JVM プロセスの にエラー メッセージが書き込まれ、stderr通常はログに記録されます。そこが一番の見どころです。他のすべてが失敗した場合は、デバッグ ログを有効にして、Tomcat アプリケーションをフォアグラウンドで実行してみてください。

于 2012-06-19T22:58:42.043 に答える
1

これと同様の問題と戦って1日を過ごしました。Amazon Elastic Beanstalk 環境にデプロイされた WAR ファイルがあります。私との違いは、AEBS 環境によってスピンアップされたインスタンスが、AEBS によって終了され、新しいインスタンスに置き換えられるまで 5 分しか続かなかったことです。

かなり掘り下げて (私のインスタンスがまだ生きている間に 5​​ 分間のチャンクで)軽く読んだ後、ポート 80 でリクエストを受信する Apache で AEBS Tomcat インスタンスが作成されていることがわかりました/_hostmanager。そうでなければ、ポート 8080 (Tomcat) に接続します。インスタンスにデプロイされた「hostmanager」と呼ばれる Ruby アプリケーションは、ポート 8999 でリッスンします。このアプリケーションは、おそらくトラフィックとその他の統計を AWS Elastic Beanstalk ホスト マネージャーに報告し、Elastic Beanstalk 環境が環境の負荷の全体像を把握できるようにします。インスタンスの数を適切に増減します。

AWS Elastic Beanstalk ホスト マネージャーは、インスタンスのホスト マネージャー アプリケーションから応答がない場合、インスタンスを終了し、新しいインスタンスを起動します。これが、あなたのサイトが 30 分続いてから死ぬ理由かもしれません。

したがって、ここでの問題は、Java アプリケーションがポート 8080 で提供されていることではなく、hostmanager アプリケーションがポート 8999 でリッスンしていないことにあると思います。これがおそらく原因です。

[Thu Jun 14 20:26:42 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8999 (localhost) failed
[Thu Jun 14 20:26:42 2012] [error] ap_proxy_connect_backend disabling worker for (localhost)

/opt/elasticbeanstalk/var/log/hostmanager.log何が起こっているのか、なぜホストマネージャーアプリケーションが不満なのかについて、より多くの手がかりが得られるかもしれないのでチェックしてください.

私の場合、ホストマネージャー アプリがwgetAmazon S3 ストレージ バケットに対して実行されており、404 応答を受け取っていることがわかりました (これは、上記の hostmanager.log を見てわかりました)。これにより、ホスト マネージャーが起動に失敗していました。したがって、着信要求がポート 8999 に再ルーティングされたとき、何もリッスンしていませんでした。失敗。インスタンスが終了しました。

ホストマネージャー アプリケーションが失敗した理由を正確に解明しようとするのではなく、Elastic Beanstalk 環境で使用されている AMI を失われた原因として扱うことにしました。私は最終的にそれを放棄し、次の手順に従って、カスタム AMI から実行される新しい Elastic Beanstalk 環境を取得しました。

  1. WAR ファイルを使用して新しい Elastic Beanstalk 環境を作成する
  2. それによって作成されたインスタンスから AMI を作成しました
  3. ステップ 2 で作成した AMI から通常の EC2 インスタンスを作成しました
  4. 必要な追加ビットを追加しました (Tomcat マネージャーなど)
  5. ステップ 3 で作成した通常のインスタンスから AMI を作成しました
  6. その AMI を Elastic Beanstalk 環境に適用しました

セットアップが何であるかを正確に知らなければ、正確に支援するのは少し難しい. うまくいけば、ホストマネージャーがポート 8999 でリッスンしていることがわかっていることと、hostmanager.log の場所と運があれば、目的の場所にたどり着けるでしょう!

于 2012-07-03T10:28:29.233 に答える