Apacheのアクセスログを見ているといろんなことが分かります。
この中で、急に負荷が高くなることがあります。それは、ほとんどの場合、どこかの行儀の悪いロボット(クローラー)もどき?によるアクセスです。
このようなアクセスは、できれば退場していただきたいのですが、いたちごっこでなかなかすべてを排除できないものです。
今回は、その急なアクセスをできるだけおさえるために、mod_limitipconnを使って同一IPからの同時アクセスを制限するやり方を、簡単に解説してみたいと思います。
- 目次
- 履歴
2010年12月7日 初版
まずは、インストールから
mod_limitipconnは、標準では、インストールされていません。そのため、まず、インストールしなければならないわけです。
簡単にインストールするために、今回は、EPEL (Extra Packages for Enterprise Linux) を使って、yumでインストールしてみます。
エンタープライズ Linux 用の拡張パッケージ(EPEL) といわれ、 Red Hat Enterprise Linux (RHEL) 向けの高品質なアドオンパッケージであり、 CentOS や Scientific Linux (SL) のような RHEL からスピンオフしたディストリビューションと互換性のある、Fedora プロジェクトで有志によって作成されたパッケージになります。 Fedora は RHEL のアップストリームであり、EPEL のアドオンパッケージは主に RHEL 向けにビルドされた Fedora リポジトリをソースとしています。
ダウンロード : http://dominia.org/djao/limit/mod_limitipconn-0.23-1.el5.i386.rpm
※上記のrpmが最新か否かは、http://dominia.org/djao/limitipconn2.html を見て判断してください。
※Windows用のDLLもここにあります。
今までに、「あえてphp5.2系をインストールする(CentOS 5,CentOS 6,Scientific Linux 6)」、「あえてmysql5.1系をインストールする」を実施された方(既にEPELをインストールされています)や、個別にすでにEPELをインストールされている方は、2項から手順を進めてください。
EPEL をインストールする。
以下のファイルをダウンロードします。
CentOS 4の場合、
32bit : http://dl.fedoraproject.org/pub/epel/4/i386/epel-release-4-10.noarch.rpm
64bit : http://dl.fedoraproject.org/pub/epel/4/x86_64/epel-release-4-10.noarch.rpm
CentOS 5の場合、
32bit : http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
64bit : http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
随時更新されており、ファイル名が異なる場合がありますので、必ず、ファイル名を以下のURLからepelで検索して確認しましょう。
CentOS 4の場合、
32bit : http://dl.fedoraproject.org/pub/epel/4/i386/
64bit : http://dl.fedoraproject.org/pub/epel/4/x86_64/
CentOS 5の場合、
32bit : http://dl.fedoraproject.org/pub/epel/5/i386/
64bit : http://dl.fedoraproject.org/pub/epel/5/x86_64/
|
EPELは、いろんなサイトからyumを介してダウンロードをしますので、そのダウンロードの時間短縮には、このyum-fastestmirror は効果があります。
|
mod_limitipconn をインストールする。
mod_limitipconnは、先のEPELによってyumで簡単にインストールできます。
|
これで、最後にComplete!が出力されてばOKです。
ここまでで、mod_limitipconnのインストールは完了です。
次は、各条件の設定です。
mod_limitipconnで同時接続の上限を設定する
CentOSでは、yumでインストールが完了すると自動的にmod_limitipconnが有効になるような設定ファイル(/etc/httpd/conf.d/limitipconn.conf)が追加されます。
そのため、単純にApacheの再起動しただけでもmod_limitipconnは有効になります。ただ、何も設定していないはずなので、何も制限はしませんけどね。
では、早速、同じIPからの同時アクセスの制限を行ってみます。
まずは、/etc/httpd/conf.d/limitipconn.confでmod_limitipconnを有効にします。
|
|
また、Windowsでは、ExtendedStatus Onでエラーが出力されるかもしれません。
|
|
|
マルチドメイン(VirtualHost)を使っていない場合は、続けて、同一IPアドレスからの最大同時接続数を指定します。
※この最大接続数は、ロケーション(アドレス)毎に設定できます。以下では、ルートディレクトリ配下としています。
|
example
MaxConnPerIP 3
同時に同じIPアドレスから3つより多く接続要求がきた場合、クライアントに 503 エラーを返します。
スペースで複数指定することもできます。
example
OnlyIPLimit audio/mpeg audio/wma
音声ファイルのmpeg,wmaについてのみ、同時に同じIPアドレスから接続要求を規制します。
また、すべての音声ファイルを指定する場合は、ワイルドカードが使えます。
OnlyIPLimit audio/*
example
NoIPLimit audio/*
この場合、音声ファイルは、すべて規制されません。ですから、いくらでもダウンロードできてしまうことになります。
マルチドメイン(VirtualHost)を使っている場合は、<VirtualHost>を設定しているファイル(CentOSでは、httpd.conf)に設定します。
しかも、<VirtualHost>ディレクティブの中に、上記と同じように設定します。
|
こんな感じで設定するとOKです。
では、次に動作確認です。
mod_limitipconnの動作確認を行う
mod_limitipconnの動作確認は、abコマンドを使って行うことができます。
abコマンドは、Apacheに同梱されたツールなので、通常、Apacheが動作する環境であれば、Apacheのインストール先に同じようにインストールされていると思います。
では、早速、難しいことを抜きにテストしてみます。
|
上記のコマンドイメージでは、同時に接続を20要求し、全体で100の接続要求を行います。
結果表示については、以下の点を確認しておきましょう。
ここでは、単純に 100 – 95 = 5 となりますから、正常にレスポンスがあったのは、5となります。
95は、失敗です。ここでは、503かどうかは分かりません。200番代でなかったことだけはわかります。
そこで、503がちゃんと返ったかどうか確認するには、アクセスログを確認する必要があります。
デフォルトでは、/var/log/httpd/access.logというファイル名になります。
|
とこんな感じで、503が出力されればOKです。
そのため、実際にリアクションするまでに、ある程度時間がかかるもので試されることをおすすめします。
ざっとこんな感じで同時接続をある程度はじくことができると思います。
同時接続数は、ある程度余裕がある方が良いですが、余裕がありすぎても、負荷軽減にはならなくなってしまいます。
最初は、10から20程度を上限としておくと良いかもしれません。あとは、abコマンドやログを定期的に確認して、数値を変更していくと良いと思います。
もちろん、できるだけ小さな値が良いのですが、ページ内で画像へのリンクが多い場合は、クライアントから一度に要求が来ます。 その場合も、この規制の対象になってしまうと正しくページが表示されなくなります。
十分に気をつけて設定していきましょう。
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
2011年5月14日, 9:35 AM
[…] Apacheの同時アクセスを制限(mod_limitipconn)する […]