レンタルサーバー・自宅サーバー設定・構築のヒント
レンタルサーバー・自宅サーバー設定・構築のヒント - レンタルサーバー・自宅サーバーの設定・構築情報を公開しています。

Apacheの同時アクセスを制限(mod_limitipconn)する

2010年12月7日 2015年5月17日
apache connect limit

Apacheのアクセスログを見ているといろんなことが分かります。 この中で、急に負荷が高くなることがあります。それは、ほとんどの場合、どこかの行儀の悪いロボット(クローラー)もどき?によるアクセスです。

このようなアクセスは、できれば退場していただきたいのですが、いたちごっこでなかなかすべてを排除できないものです。

今回は、その急なアクセスをできるだけおさえるために、mod_limitipconnを使って同一IPからの同時アクセスを制限するやり方を、簡単に解説してみたいと思います。

まずは、インストールから

mod_limitipconnは、標準では、インストールされていません。そのため、まず、インストールしなければならないわけです。

簡単にインストールするために、今回は、EPEL (Extra Packages for Enterprise Linux) を使って、yumでインストールしてみます。

EPEL (Extra Packages for Enterprise Linux)とは、
エンタープライズ Linux 用の拡張パッケージ(EPEL) といわれ、 Red Hat Enterprise Linux (RHEL) 向けの高品質なアドオンパッケージであり、 CentOS や Scientific Linux (SL) のような RHEL からスピンオフしたディストリビューションと互換性のある、Fedora プロジェクトで有志によって作成されたパッケージになります。 Fedora は RHEL のアップストリームであり、EPEL のアドオンパッケージは主に RHEL 向けにビルドされた Fedora リポジトリをソースとしています。

直接、rpmをダウンロードしてインストールすることもできます。
ダウンロード : 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


上記は、あくまで2010.12.5 現在の最新のEPELです。
随時更新されており、ファイル名が異なる場合がありますので、必ず、ファイル名を以下の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/
ここでは、CentOS 5の32bit版として進めます。

$ wget http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
$ rpm -ivh epel-release-5-4.noarch.rpm

EPELを使うにあたって、yum-fastestmirror をインストールされることをおすすめします。
EPELは、いろんなサイトからyumを介してダウンロードをしますので、そのダウンロードの時間短縮には、このyum-fastestmirror は効果があります。
$ yum install yum-fastestmirror

mod_limitipconn をインストールする。

mod_limitipconnは、先のEPELによってyumで簡単にインストールできます。

$ yum install -y mod_limitipconn

これで、最後に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を有効にします。

# This module will not function unless mod_status is loaded and the
# "ExtendedStatus On" directive is set. So load only if mod_status is too.
<IfModule mod_status.c>

    # This is always needed
    ExtendedStatus On

    # mod_limitipconn configuration
    LoadModule limitipconn_module modules/mod_limitipconn.so

    # A global default configuration doesn't make much sense. See the README
    # from the mod_limitipconn package for configuration examples.
</IfModule>
Windows版では、<IfModule mod_status.c>のディレクティブを使用せずに、
ExtendedStatus On
LoadModule limitipconn_module modules/mod_limitipconn.dll
httpd.confファイルに記述します。

また、Windowsでは、ExtendedStatus Onでエラーが出力されるかもしれません。
 Invalid command 'ExtendedStatus'
この場合、環境が整っていないことが多いです。 例えば、httpd.confファイルの以下のLoadModuleの記述がなかったり、コメントアウトされていないか確認してみましょう。
          :
LoadModule status_module modules/mod_status.so
          :
LoadModule userdir_module modules/mod_userdir.so
          :
それでもエラーがでるようなら、以下のモジュールがコメントアウトされていないか確認してみると回避できるかもしれません。
mod_env.c
mod_log_config.c
mod_mime.c
mod_negotiation.c
mod_status.c
mod_include.c
mod_autoindex.c
mod_dir.c
mod_cgi.c
mod_asis.c
mod_imap.c
mod_actions.c
mod_userdir.c
mod_alias.c
mod_access.c
mod_auth.c
mod_setenvif.c
mod_limitipconn.c

マルチドメイン(VirtualHost)を使っていない場合は、続けて、同一IPアドレスからの最大同時接続数を指定します。
※この最大接続数は、ロケーション(アドレス)毎に設定できます。以下では、ルートディレクトリ配下としています。

<IfModule mod_limitipconn.c>
    <Location />
        MaxConnPerIP 10
    </Location>
    <FilesMatch "\.(zip|mp?g|iso)$">
        MaxConnPerIP 2
    </FilesMatch>
</IfModule>
FilesMatch
ファイル名を正規表現でチェックし、一致している場合は、ディレクティブで指定した同一IPアドレスからの最大同時接続数で制限します。
mod_limitipconn
この内で使用できる固有のディレクティブは以下のとおりです。
MaxConnPerIP
最大接続数を指定します。0 は無制限になります。

example
MaxConnPerIP 3

同時に同じIPアドレスから3つより多く接続要求がきた場合、クライアントに 503 エラーを返します。

OnlyIPLimit
制限する mime type (ファイル形式) を指定します。ワイルドカード( * )が使用できます。

スペースで複数指定することもできます。


example
OnlyIPLimit audio/mpeg audio/wma

音声ファイルのmpeg,wmaについてのみ、同時に同じIPアドレスから接続要求を規制します。
また、すべての音声ファイルを指定する場合は、ワイルドカードが使えます。

example
OnlyIPLimit audio/*
NoIPLimit
指定したファイル形式は制限しないようにします。OnlyIPLimitの逆ですね。設定方法も全く同じです。
example
NoIPLimit audio/*

この場合、音声ファイルは、すべて規制されません。ですから、いくらでもダウンロードできてしまうことになります。

マルチドメイン(VirtualHost)を使っている場合は、<VirtualHost>を設定しているファイル(CentOSでは、httpd.conf)に設定します。
しかも、<VirtualHost>ディレクティブの中に、上記と同じように設定します。

<VirtualHost *:80>
    ServerName www.example.com
    DocumentRoot "/var/www/html/example"
    ServerAlias www.example.com
    <IfModule mod_limitipconn.c>
        <Location />
            MaxConnPerIP 5
        </Location>
        <FilesMatch "\.(zip|mp?g|iso)$">
            MaxConnPerIP 2
        </FilesMatch>
    </IfModule>
</VirtualHost>

こんな感じで設定するとOKです。

では、次に動作確認です。

mod_limitipconnの動作確認を行う

mod_limitipconnの動作確認は、abコマンドを使って行うことができます。
abコマンドは、Apacheに同梱されたツールなので、通常、Apacheが動作する環境であれば、Apacheのインストール先に同じようにインストールされていると思います。

では、早速、難しいことを抜きにテストしてみます。

$ ab -n 100 -c 20 http://www.example.com/

D:\web\apache\bin>ab -n 100 -c 20 http://www.example.com/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.example.com (be patient).....done


Server Software:        Apache
Server Hostname:        www.example.com
Server Port:            80

Document Path:          /
Document Length:        64042 bytes

Concurrency Level:      20
Time taken for tests:   2.984 seconds
Complete requests:      100
Failed requests:        95
   (Connect: 0, Receive: 0, Length: 95, Exceptions: 0)
Write errors:           0
Non-2xx responses:      95
Total transferred:      369145 bytes
HTML transferred:       350895 bytes
Requests per second:    33.51 [#/sec] (mean)
Time per request:       596.875 [ms] (mean)
Time per request:       29.844 [ms] (mean, across all concurrent requests)
Transfer rate:          120.79 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       16   29   5.1     31      31
Processing:    31  508 129.9    563     578
Waiting:       31  432 117.3    453     563
Total:         47  538 130.2    594     609

Percentage of the requests served within a certain time (ms)
  50%    594
  66%    594
  75%    594
  80%    594
  90%    594
  95%    594
  98%    609
  99%    609
 100%    609 (longest request)

$ 

上記のコマンドイメージでは、同時に接続を20要求し、全体で100の接続要求を行います。
結果表示については、以下の点を確認しておきましょう。

Complete requests:
返信があった数
Failed requests:
エラー返信があった数
Non-2xx responses:
200番代のエラーでないエラー返信があった数

ここでは、単純に 100 – 95 = 5 となりますから、正常にレスポンスがあったのは、5となります。
95は、失敗です。ここでは、503かどうかは分かりません。200番代でなかったことだけはわかります。

そこで、503がちゃんと返ったかどうか確認するには、アクセスログを確認する必要があります。
デフォルトでは、/var/log/httpd/access.logというファイル名になります。

127.0.0.1 - - [07/Dec/2010:01:33:49 +0900] "GET / HTTP/1.0" 503 323

とこんな感じで、503が出力されればOKです。

このabコマンドでは、同時接続要求をしても、実際に、ある程度、処理速度があるサーバーでは、同時接続とみなさないこともあります。
そのため、実際にリアクションするまでに、ある程度時間がかかるもので試されることをおすすめします。

ざっとこんな感じで同時接続をある程度はじくことができると思います。

同時接続数は、ある程度余裕がある方が良いですが、余裕がありすぎても、負荷軽減にはならなくなってしまいます。
最初は、10から20程度を上限としておくと良いかもしれません。あとは、abコマンドやログを定期的に確認して、数値を変更していくと良いと思います。
もちろん、できるだけ小さな値が良いのですが、ページ内で画像へのリンクが多い場合は、クライアントから一度に要求が来ます。 その場合も、この規制の対象になってしまうと正しくページが表示されなくなります。

十分に気をつけて設定していきましょう。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない検索ができないことがあります。


関連記事 :

sshpassを使ってパスワード指定のSSH接続を行ってみる(パスワード指定自動ログイン)

今回は、SSHです。 sshpass( Non-interactive ssh password authentication ) を使う ...

httpd(apache)の最新版をインストールする(CentOS,ScientificLinux編)

httpd(apache)をインストールする(CentOS,ScientificLinux編) などでhttpd(apache)のインストールを ...

sendmail で milter-regex を使ってスパム対策

以前の記事 評判のさくらのVPSでSMTP(Sendmail)を公開する時にやっておきたいこと では、SPFの送信側の対処 sendmai ...

CentOS,ScientificLinuxでLAMP(Lighttpd+MySQL+PHP)インストールからWordpressを動かすまで(Lighttpd編)

今回は、最短でLAMPインストールし、Wordpressを動かすまでの手順について解説してみたいと思います。 とりあえず、CentOS / S ...

apache の FastCGI(mod_fcgid) で phpを動かしてみる

前回の「apache で phpのモジュール版とcgi版の切り替えを行ってみる」でCGIの環境設定を行いました。 ここでは、更に一歩進んで、F ...


1 件 コメントがあります。 コメントを投稿する
  1. […] Apacheの同時アクセスを制限(mod_limitipconn)する […]


コメントを投稿 :

お名前 *

メールアドレス *
( メールアドレスが公開されることはありません。)

サイトアドレス

コメント *

* 印の項目は、入力が必要な項目です。




最近投稿の記事

[ 画像提供元 : Amazon ] 先日、1TBのディスクの入れ替え時にバックアップをとろうとディスクコピーを行いました。 その際 ...

Windows で Linux ファイルシステム Ext4 のディスクをマウントするには? Ext3Fsd が、おそらく、最も簡単なツール ...

今回は、Windows で Compass を使ってみました。 Compass とは、 Sass(サス、Syntactica ...

今回は、Anti Adblock を使ってみました。 Anti Adblock とは、 そもそも Adblock という ウェブ ...

デスクトップ環境でない サーバーで、Webページのキャプチャー画像をコマンドで撮る には、wkhtmltoimage, CutyCapt ...


さくらのVPS 全プラン リニューアルです。(石狩(北海道)も選択可)


root権限ありで ¥685 / 月 ~ と非常にリーズナブルな CPU 1(core)の 512 プランから、 最高 CPU 10(core), メモリ 32(GB), SSD容量 800(GB) までとプランが充実。
ディスクは、SSDとHDDの選択が可能になった他、データセンターは人気の東京、石狩(北海道)となりました。

また、どのプランでも好きなOSが選べます
( CentOS, Fedora, Scientific Linux, FreeBSD, Ubutu, Debian )

管理人もおすすめのVPSです。
試用期間がありますから、一度、お試しを!!

詳しくは、http://vps.sakura.ad.jp/さくらのVPSのサイトへ へどうぞ!!

カテゴリ


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。
最近、スワップにも対応した Serverman@VPS は、かなりリーズナブルかもです。

  • メモリ1GB~2GBのEntryプラン :月額:490円
  • メモリ2MB~4GBのStandardプラン :月額:980円
  • メモリ4GB~8GBのProプラン :月額:1,980円

新規申し込みで1ヶ月間完全無料となるキャンペーンを実施中です。
Serverman@VPSの特徴は、安さとIPv6対応です。また、初期設定費0円もポイントです。

IPv6でちょっと遊んでみたい方には、おすすめかもしれませんね。最低利用期間もありませんから、気に入らないときは即解約もできます。

Serverman@VPSの詳細については、 http://dream.jp/vps/ Serverman@VPSのサイトへへどうぞ。



KVM採用 ConoHa VPSは、時間単位で借りれる便利なVPSです。


ConoHa VPS は、初期設定費0円最低利用期間無し時間単位で清算可能、 さらに、Web APIを使って自動化を図ることもできる便利なVPSです。

海外サーバー設置も可能で、ローカル接続にも対応と、かなり、機能豊富なサーバーです。

新規ユーザ登録で、クーポンもらえますから、まずは、お試しですね。

ConoHa VPSの詳細については、
http://www.conoha.jp/ へどうぞ。

KVM採用 お名前.com VPS(KVM) 2G プラン 初期設定費無料 キャンペーン 実施です。


メモリ2GBプラン CPU:3core、Disk:200GB
月額:1,153円から (初期設定:1,680円0円)

さくらのVPSがリニューアルされてもなんのその。
1GBメモリ / 2Core を ¥834 – の格安価格で提供中です!
間違いなくスペックからすると割安感ありです。
年間割引時の途中解約で返金がないのは、 ちょっと残念ですが、それでもこの割安感は魅力です。

まずは、お試しですね。

お名前.com VPS(KVM)の詳細については、
http://www.onamae-server.com/vps/ へどうぞ。(お試し期間が15日あります。)



  • ソーシャルブックマーク

  • はてなブックマークへ追加するはてな登録数
ページトップへ
Time : 0.2322 [s]