web-dev-qa-db-ja.com

グーグルクローラーがサイトにアクセスすると、メモリ/ CPUの過負荷でApacheがクラッシュする

トラフィックが少なく、1日あたりのヒット数が500未満のサイトがあります。 6Gのメモリを搭載しており、十分に活用されておらず、平均5%が使用されています。しかし、googlebotが私のウェブサーバー/ Apacheへの接続を確立するとすぐに、メモリとCPU使用率が数秒で急上昇し、サーバーにアクセスできなくなります-ウェブサイト、ssh、その他すべてのサービス。

ポート80に対してlsofを実行すると、サイトが数秒でクラッシュする前に表示される内容は次のとおりです。

lsof -i:80 mywebsite:http-> crawl-66-249-71-200.googlebot.com:43567(ESTABLISHED)

GoogleBotは遅いクロール速度に設定されています。

Apacheの構成は次のとおりです。

ServerLimit 256 
MaxClients 150 
MaxRequestsPerChild 100 
KeepAlive Off 
KeepAliveTimeout 5 
MaxKeepAliveRequests 100

エラーログには次の内容が表示されます。

Cannot allocate memory: couldn't create child process: /opt/suphp/sbin/suphp
2
Daniel t.

私の仕事は、負荷が急増したときにサーバー上のGooglebotやその他のクローラーを積極的にブロックします。私は確かにそれに同意しません、そして私の意見では、私たちが何千もの多くの異なるウェブサイトをホストしているにもかかわらず、それをブロックしなければならないとき、それは一般にサーバーではるかに悪い何かの兆候です。一方、あなたはあなた自身のサーバーを持っているようです。

Rilindoが推測したように、これが私に信じさせるのは、構成に何か問題があるということです。提供したサンプル構成には、親指の痛みのように突き出るアイテムが少なくとも1つあります。

MaxRequestsPerChild 100 

これにより、Apacheが子プロセスを迅速に強制終了し、新しいプロセスを作成することをご存知ですか?ほとんどの場合、これのデフォルトは10000です。まず、10000に設定して、どこに到達するかを確認します。

また、suphpを使用していることもわかります。システムにセキュリティが懸念されるさまざまなユーザーが多数いる場合を除いて、代わりにmod_phpを使用することをお勧めします。 mod_phpは、Apacheが作業を処理する個別のPHP実行可能ファイルを持つのではなく、PHPを処理できるようにするApacheモジュールです。これにより、メモリとCPU時間を共有し、Apacheを介してスレッド化できます(ワーカーやイベントなどのスレッド化されたMPMを使用する)。これは、全体的な負荷の軽減を意味します。

セキュリティ上の懸念からmod_phpの使用が選択肢にない場合は、mod_fcgidに切り替えることをお勧めします。これはsuphpのドロップイン代替品ですが、はるかに高速です。

2
laebshade

GoogleBotをブロックするかどうかを知りたいと思います。これは、robots.txtやその他のメジャーを追加することで可能になります。

http://www.google.com/support/webmasters/bin/answer.py?answer=937

ただし、256は6ギガのマシンではかなり低いです。実際、ほとんど静的なファイルを使用してサイトを実行している場合、さらに悪いことに、256台のサーバーが最大になる可能性があります。

PHP/mySQLまたはMVCWebアプリを実行していますか? Ruby Rails、Django、またはある種のCMSサイトですか?その場合は、おそらくそのサイトをもう一度確認する必要があります。そのサイトには、でのみ公開される問題がある可能性があります。 GoogleBotによって生成されたものなどの多数の接続。

0
Rilindo