web-dev-qa-db-ja.com

キャッシュされたコンテンツにより、404エラーが大量に発生し、接続が多すぎます

私のサイトは、トラフィックが多いため、3日間ほとんど応答していません。

ページ上のJavaScript要素がサーバーからの画像を定期的に要求し、ユーザーがブラウザーウィンドウを開いたままにしておくと、接続数が問題になりました(したがって、画像の要求を停止することはありませんでした)。

単一のスプライトを使用して1回だけロードするようにサイトを再設計しました。ただし、今でも古いコンテンツを読み込もうとしているため、404エラーが大量に発生しています。サイトはVPS上にあり、待ち時間のために使用できません。

さらに悪いことに、私は当初、レイテンシーはキャッシュの不足によるものだと思っていました。訪問者がリソースをキャッシュするためのディレクティブを.htaccessファイルに追加しました(古い、非効率的なコードが含まれています)。

ホストが問題を修正できませんでした。永続的な接続が廃止されたコンテンツのロードを停止するように強制するにはどうすればよいですか?

1
Peter

ホストのシステム管理者がスクリプトで解決しました。

古いコンテンツにアクセスしようとするIPアドレス(本質的に、そのようなユーザーは継続的に要求を行い、接続を消費します)は、サーバーのファイアウォールにすぐに追加されます。これまでのところ、数百(数千の訪問者のうち)だけが検出され、ブロックされています。このソリューションは非常にうまく機能しています。

0
Peter

誰かが存在しないリソースにリクエストを送信するのを実際に阻止することはできません(たとえば、誰もが存在しないページのURLを作成して、404を取得できます)。ただし、状況を改善するためにできることがいくつかあるかもしれません。

まず、新しいコンテンツのファイル名を変更します。HTMLでjavascriptファイルを参照している場合は、問題のあるファイルとは異なる名前を付けて、ブラウザがキャッシュされたコピーを使用しないようにします。

次に、404ページをできるだけシンプルにします(動的なものではなく、非常に小さい静的なページを選択してください)。

第3に、Apacheは、使用可能なメモリが多くない場合、多数の同時リクエストを処理するのにそれほど効率的ではありません(リクエストごとに1つのワーカースレッドを起動します)。 404リクエストをより効率的に処理する別のサーバーをApacheの前に(少なくとも一時的に)追加することを検討してください。いくつかの例が含まれる場合があります。

  • nginx-404リクエスト(および場合によってはすべての静的ファイル)を処理し、proxy_passの他のリクエストをApacheに戻します(プロキシされたリクエストをキャッシュすることもできます)
  • ワニス-404リクエストをキャッシュしてメモリから直接提供できるため、Apacheの負荷が軽減されます
3
cyberx86

まず、すぐにゼロバイトのファイルを作成して404を取り除き、各取得のコストを最小限に抑えます。

1
David Schwartz