<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Groove Labo &#187; Apache</title>
	<atom:link href="http://labo.opengroove.com/blog/category/web-server/apache/feed/" rel="self" type="application/rss+xml" />
	<link>http://labo.opengroove.com/blog</link>
	<description>株式会社オープングルーヴの開発者のブログ</description>
	<lastBuildDate>Tue, 28 Sep 2010 06:09:57 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>mod_dosdetector でDoS対策</title>
		<link>http://labo.opengroove.com/blog/2009/11/18/mod_dosdetector-%e3%81%a7dos%e5%af%be%e7%ad%96/</link>
		<comments>http://labo.opengroove.com/blog/2009/11/18/mod_dosdetector-%e3%81%a7dos%e5%af%be%e7%ad%96/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 04:27:39 +0000</pubDate>
		<dc:creator>sugimoto</dc:creator>
				<category><![CDATA[Apache]]></category>

		<guid isPermaLink="false">http://labo.opengroove.com/blog/?p=436</guid>
		<description><![CDATA[sugimotoです。 Apache のDoS対策として mod_dosdetector を使ったのでメモです。 1. mod_dosdetector の設定 インストールの方法などは「dos対策のmod_dosdetectorで特定のContentTypeは、対象外にする方法」というBlogがあったので参考にしました。 設定の書き方もいろいろなサイトに載っていましたが、静的ファイルをアクセス回数の対象外にする方法が正しくないところが多いようです。 静的ファイルの除外は DoSIgnoreContentType ディレクティブで設定しますが、 &#60;IfModule dosdetector_module&#62; ... 省略 ... DoSIgnoreContentType .(js&#124;png&#124;jpe?g&#124;gif&#124;css&#124;ico) &#60;/IfModule&#62; のような設定をしてテストしたところ、設定追加前と同じ回数でDoS判定されてしまいました。 このディレクティブは名前の通り Content-Type を設定するのが正しいので、次のように静的ファイルの Content-Type を設定すると正しく認識されました。 &#60;IfModule dosdetector_module&#62; ... 省略 ... DoSIgnoreContentType ^(image/&#124;application/&#124;text/javascript&#124;text/css) &#60;/IfModule&#62; 2. 利用可能なディレクティブ 利用可能なすべてのディレクティブは以下の通りです。 DoSDetection DoS判定をする/しないのフラグ(On/Off) DoSThreshold 判定の閾値 &#8211; 注意レベル(回) DoSHardThreshold 判定の閾値 &#8211; 警告レベル(回) DoSPeriod DoS判定をする基準時間(秒) DoSBanPeriod DoS認定したクライアントを再度開放するまでの時間(秒) DoSShmemName クライアントを保存するために保持するシェアードメモリの名前 DoSTableSize [...]]]></description>
			<content:encoded><![CDATA[<p>sugimotoです。</p>

<p>Apache のDoS対策として <a href="http://sourceforge.net/projects/moddosdetector/">mod_dosdetector</a> を使ったのでメモです。</p>

<h3>1. mod_dosdetector の設定</h3>

<p>
インストールの方法などは「<a href="http://d.hatena.ne.jp/zenpou/20080923/1222185231">dos対策のmod_dosdetectorで特定のContentTypeは、対象外にする方法</a>」というBlogがあったので参考にしました。
</p>

<p>
設定の書き方もいろいろなサイトに載っていましたが、静的ファイルをアクセス回数の対象外にする方法が正しくないところが多いようです。
</p>

<p>
静的ファイルの除外は DoSIgnoreContentType ディレクティブで設定しますが、
</p>

<pre>
&lt;IfModule dosdetector_module&gt;
    ... 省略 ...
    DoSIgnoreContentType .(js|png|jpe?g|gif|css|ico)
&lt;/IfModule&gt;
</pre>

<p>
のような設定をしてテストしたところ、設定追加前と同じ回数でDoS判定されてしまいました。
</p>

<p>
このディレクティブは名前の通り Content-Type を設定するのが正しいので、次のように静的ファイルの Content-Type を設定すると正しく認識されました。
</p>

<pre>
&lt;IfModule dosdetector_module&gt;
    ... 省略 ...
    DoSIgnoreContentType ^(image/|application/|text/javascript|text/css)
&lt;/IfModule&gt;
</pre>

<h3>2. 利用可能なディレクティブ</h3>

<p>
利用可能なすべてのディレクティブは以下の通りです。
</p>

<dl>
    <dt>DoSDetection</dt>
        <dd>DoS判定をする/しないのフラグ(On/Off)</dd>
    <dt>DoSThreshold</dt>
        <dd>判定の閾値 &#8211; 注意レベル(回)</dd>
    <dt>DoSHardThreshold</dt>
        <dd>判定の閾値 &#8211; 警告レベル(回)</dd>
    <dt>DoSPeriod</dt>
        <dd>DoS判定をする基準時間(秒)</dd>
    <dt>DoSBanPeriod</dt>
        <dd>DoS認定したクライアントを再度開放するまでの時間(秒)</dd>
    <dt>DoSShmemName</dt>
        <dd>クライアントを保存するために保持するシェアードメモリの名前</dd>
    <dt>DoSTableSize</dt>
        <dd>クライアントを保存するためのテーブルのサイズ</dd>
    <dt>DoSIgnoreContentType</dt>
        <dd>アクセス回数としてカウントしないContent-Typeの指定</dd>
</dl>

<h3>3. DoS認定されたクライアントの処理を追加する</h3>

<p>
Apache の設定ファイルに以下の設定を追加して、DoS認定(警告レベル)となったクライアントを「403 (FORBIDDEN)」にします
</p>

<pre>
    RewriteEngine On
    RewriteCond %{ENV:SuspectHardDoS} .+
    RewriteCond %{REMOTE_ADDR} !^192\.168\.1\. # ローカルネットワークからのアクセスは無視
    RewriteCond %{REMOTE_ADDR} !^xxx\.xxx\.xxx\.xxx$ # テストユーザーからのアクセスは無視
    RewriteCond %{HTTP_USER_AGENT} !Googlebot
    RewriteCond %{HTTP_USER_AGENT} !Yahoo
    RewriteRule .* – [F,L]
</pre>

<p>
なお、以下の場合はDoS判定しないように設定しています
</p>

<ol>
    <li>192.168.1.* : ローカルネットワークからのアクセスは監視サーバーなどの自動アクセスがあるため除外</li>
    <li>xxx.xxx.xxx.xxx : 自社オフィスなどのIPアドレスからのアクセスはテストなどで頻繁にアクセスすることがあるため、除外しました</li>
    <li>Googlebot : Googleはインデックスされないと困るので。。。除外</li>
    <li>Yahoo : Yahooもインデックスされないと困るので。。。</li>
</ol>

<h3>4. DoS対策のテスト</h3>

<p>
設定のテストは Apache Bench を使うと簡単に実行できます。
</p>

<pre>
> ab -n 1000 -c 3 -k http://xxxx.ciklone.com/xxxx
</pre>

<ul>
    <li>-n 1000 : 1000アクセスする負荷テストを実行</li>
    <li>-c 3 : 同時アクセス数を 3 に設定</li>
</ul>

<h3>5. その他の負荷対策モジュール</h3>

<p>
最後にその他の負荷対策モジュールについても書いておきます。
</p>

<ul>
    <li>mod_cband : 帯域と同時接続の制限
        <ul class="normal">
            <li><a href="http://www.kamakura-lin.info/2008/08/mod_cband.php">mod_cband (LIN Networks)</a></li>
        </ul>
    </li>

    <li>mod_limitipconn : 同一IPからの同時接続を制限する
        <ul class="normal">
            <li><a href="http://dominia.org/djao/limitipconn2.html">mod_limitipconn.c</a></li>
            <li><a href="http://www.atmarkit.co.jp/flinux/rensai/apache2_08/apache08d.html">接続数／帯域制限で無法なダウンローダを撃退（4/4） － ＠IT</a></li>
            <li><a href="http://paranoids.sakura.ne.jp/kaworu/2009-07-05-1.php">Apache mod_limitipconnでIPの最大接続数制限をする</a></li>
        </ul>
    </li>
    <li>mod_bwshare : 同一IPの帯域、接続数を制限する
        <ul class="normal">
            <li>活動してるのか･･･.. =&gt; <a href="http://www.netnice.org/pukiwiki.php?mod_bwshare">http://www.netnice.org/pukiwiki.php?mod_bwshare</a></li>
            <li><a href="http://www.atmarkit.co.jp/flinux/rensai/apache2_08/apache08c.html">接続数／帯域制限で無法なダウンローダを撃退（3/4） － ＠IT</a></li>
            <li><a href="http://tomo.ac/goodstream/server/apache/tips/bwshare.html">トラフィック制御する方法（bwshare）</a></li>
        </ul>
    </li>
    <li>mod_access_limit : 全アクセス数を制限?? &#8211; 活動していないかも。。
        <ul class="normal">
            <li><a href="http://www.apache.jp/pipermail/apache-users/2002-January/000883.html">Apache-Users 880 mod_access_limit (アクセスリミットモジュール)</a></li>
        </ul>
    </li>
</ul>

<h3><span style="color: #999999;">ソフトウェアエンジニアのためのバグトラッキングシステム : Ciklone</span></h3>

<p><a title="ソフトウェアエンジニアのためのバグトラッキングシステム" href="http://ciklone.com/"><img class="alignnone" title="ソフトウェアエンジニアのためのバグトラッキングシステム" src="http://www.opengroove.com/images/ciklone-banner.png" alt="ソフトウェアエンジニアのためのバグトラッキングシステム" width="224" height="50" /></a></p>

<p><a style="color: #999999;" href="http://ciklone.com/" title="ソフトウェアエンジニアのためのバグトラッキングシステム">ソフトウェアエンジニアのためのバグトラッキングシステム</a></p>
]]></content:encoded>
			<wfw:commentRss>http://labo.opengroove.com/blog/2009/11/18/mod_dosdetector-%e3%81%a7dos%e5%af%be%e7%ad%96/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>負荷試験の考え方（お客様へ説明すべきこと）</title>
		<link>http://labo.opengroove.com/blog/2009/08/17/%e8%b2%a0%e8%8d%b7%e8%a9%a6%e9%a8%93%e3%81%ae%e8%80%83%e3%81%88%e6%96%b9%ef%bc%88%e3%81%8a%e5%ae%a2%e6%a7%98%e3%81%b8%e8%aa%ac%e6%98%8e%e3%81%99%e3%81%b9%e3%81%8d%e3%81%93%e3%81%a8%ef%bc%89/</link>
		<comments>http://labo.opengroove.com/blog/2009/08/17/%e8%b2%a0%e8%8d%b7%e8%a9%a6%e9%a8%93%e3%81%ae%e8%80%83%e3%81%88%e6%96%b9%ef%bc%88%e3%81%8a%e5%ae%a2%e6%a7%98%e3%81%b8%e8%aa%ac%e6%98%8e%e3%81%99%e3%81%b9%e3%81%8d%e3%81%93%e3%81%a8%ef%bc%89/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 11:22:53 +0000</pubDate>
		<dc:creator>syoji</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[ソフトウェア開発]]></category>
		<category><![CDATA[テスト]]></category>

		<guid isPermaLink="false">http://labo.opengroove.com/blog/?p=358</guid>
		<description><![CDATA[Webアプリケーションやクライアントサーバ型のシステム開発の中で性能要件を満たすために負荷試験やロード試験といわれる工程がある。 重要な工程として考えているが、スケジュールの厳しいプロジェクトなどでは後回しにされることがあった。 特に、開発が遅れている場合、要件を満たすための開発が重視されることは理解しているが、負荷試験を実施することは同じくらい大切な工程である。試験で起こることは当然、本番環境でも起こり、あとで痛い目をみないためにも必須の工程である。 負荷試験を設計する上での考え方をまとめてみたいと思う。 以下のサイトが参考になる。 理論的・計画的なWebアプリケーションのテストの実現：第4回　テストを設計するには（その2） (1/2) &#8211; ITmedia エンタープライズ 負荷試験とは 構築するシステムがどの程度の負荷に耐えられるかを測定し、システムの信頼性と耐用範囲を明確にする。ウェブアプリケーションの場合、同時アクセスユーザ数をどれだけ処理出来るか、閾値を越えた場合のシステムの振る舞いを検証する試験である。 負荷試験で使われる試験環境は本番環境と同一であることが望ましい。しかし、実際には機器調達が難しいことが多い（例えば、想定している分だけのクライアントマシンを用意する等）。機器が準備できない場合、サーバに負荷を発生させるツール等を使用し、高負荷、過負荷を与え、システムの振舞いについて検証する。 負荷試験の計画（設計）に必要なこと 負荷試験を計画するときに最低限、考えなければいけないことを説明したい。 前提条件 試験を実施するときの試験環境について、サーバの役割、台数、クライアント数、負荷をかける時間等の環境について条件を明確化しておく必要がある。 監視ポイント 例えば、Webアプリケーションの場合、クライアントがアクセスしトップページが表示されるまでの時間。など要件を満たすために必要な監視ポイントを明確にしておく必要がある。サーバサイドではDBに対する大量のI/O（書込、読み出し等）がそれにあたると思われる。 目的と対象範囲 負荷試験でクリアしなければいけない要件、ユーザ数などの試験の目的と対象範囲/ハード情報(各サーバのOS情報/CPU/DISK IO/MEMORY/NETWORK)、過負荷時の測定範囲を明確にする。 性能要件（目標値） 想定されるクライアント数から性能要件を予測し、定義する。レスポンス時間等の試験項目から測定可能な数値を予測する。 例えば年に1度のみ過負荷が発生するといった事象に合わせてシステムを組んだ場合、性能要件は十分であるが、コスト面で満足するものにはならない場合がある。そのため、要件にあった目標値を設定することは重要である。 想定シナリオ 構築するシステムの利用シーンを考えたシナリオを作成する。試験実施はそのシナリオに沿って行われるべきである。 例えば、メールクライアントの場合、社員が出社する時間(09:00頃)が大量のアクセスが発生する、など。その利用シーンをシナリオに組み込む。 実施方法 市販のツールを利用する、自作ツールを利用する、など目標値を達成するためには過負荷状態を作らなければいけない。疑似的に過負荷状態を作り出す必要がある。Webアプリケーションに限定されるが無料ですばらしいツールが多く提供されている。 ＠IT：JMeterによるWebサーバ性能評価の勘所（1/3） The Jakarta Site &#8211; The Jakarta Project &#8212; Java Related Products JMeter(高機能/フリーなテストツール)第1回：JMeterの基本 試験結果 負荷試験計画時の「目的と対象範囲」を達成したかどうか、 実測値が予測値より悪い場合や、目標値ギリギリの場合、チューニングを実施することになる。 問題点の原因については、計測データなどを使って トランザクション数/クライアント数が増加しているとき、スループットの増加傾向が変化した時点 レスポンスタイムが急速に遅くなった点 分析するポイントとして、システムの測定値が急激に変化したとき、関連するモジュールがボトルネックと考えられる。 チューニングについては、そのようなボトルネックと予測されるモジュールから優先的に検証する必要がある。 以上のような点について、負荷試験の計画フェーズで考えておけば良いのではないかと考える。 負荷試験が実施されるのはシステムが構築され、結合試験も終わった以降になる。一番忙しいフェーズであるが 負荷試験の重要性を説明し、しっかりと計画をして実施していきたいと思う。]]></description>
			<content:encoded><![CDATA[<p>Webアプリケーションやクライアントサーバ型のシステム開発の中で性能要件を満たすために負荷試験やロード試験といわれる工程がある。</p>

<p>重要な工程として考えているが、スケジュールの厳しいプロジェクトなどでは後回しにされることがあった。
特に、開発が遅れている場合、要件を満たすための開発が重視されることは理解しているが、負荷試験を実施することは同じくらい大切な工程である。試験で起こることは当然、本番環境でも起こり、あとで痛い目をみないためにも必須の工程である。</p>

<p>負荷試験を設計する上での考え方をまとめてみたいと思う。 以下のサイトが参考になる。</p>

<ul>
    <li><a title="理論的・計画的なWebアプリケーションのテストの実現：第4回　テストを設計するには" href="http://www.itmedia.co.jp/enterprise/articles/0502/24/news070.html">理論的・計画的なWebアプリケーションのテストの実現：第4回　テストを設計するには（その2） (1/2) &#8211; ITmedia エンタープライズ</a></li>
</ul>

<h3>負荷試験とは</h3>

<p>構築するシステムがどの程度の負荷に耐えられるかを測定し、システムの信頼性と耐用範囲を明確にする。ウェブアプリケーションの場合、同時アクセスユーザ数をどれだけ処理出来るか、閾値を越えた場合のシステムの振る舞いを検証する試験である。</p>

<p>負荷試験で使われる試験環境は本番環境と同一であることが望ましい。しかし、実際には機器調達が難しいことが多い（例えば、想定している分だけのクライアントマシンを用意する等）。機器が準備できない場合、サーバに負荷を発生させるツール等を使用し、高負荷、過負荷を与え、システムの振舞いについて検証する。</p>

<p>負荷試験の計画（設計）に必要なこと
負荷試験を計画するときに最低限、考えなければいけないことを説明したい。</p>

<h4>前提条件</h4>

<p>試験を実施するときの試験環境について、サーバの役割、台数、クライアント数、負荷をかける時間等の環境について条件を明確化しておく必要がある。</p>

<h4>監視ポイント</h4>

<p>例えば、Webアプリケーションの場合、クライアントがアクセスしトップページが表示されるまでの時間。など要件を満たすために必要な監視ポイントを明確にしておく必要がある。サーバサイドではDBに対する大量のI/O（書込、読み出し等）がそれにあたると思われる。</p>

<h4>目的と対象範囲</h4>

<p>負荷試験でクリアしなければいけない要件、ユーザ数などの試験の目的と対象範囲/ハード情報(各サーバのOS情報/CPU/DISK IO/MEMORY/NETWORK)、過負荷時の測定範囲を明確にする。</p>

<h4>性能要件（目標値）</h4>

<p>想定されるクライアント数から性能要件を予測し、定義する。レスポンス時間等の試験項目から測定可能な数値を予測する。
例えば年に1度のみ過負荷が発生するといった事象に合わせてシステムを組んだ場合、性能要件は十分であるが、コスト面で満足するものにはならない場合がある。そのため、要件にあった目標値を設定することは重要である。</p>

<h4>想定シナリオ</h4>

<p>構築するシステムの利用シーンを考えたシナリオを作成する。試験実施はそのシナリオに沿って行われるべきである。
例えば、メールクライアントの場合、社員が出社する時間(09:00頃)が大量のアクセスが発生する、など。その利用シーンをシナリオに組み込む。</p>

<h4>実施方法</h4>

<p>市販のツールを利用する、自作ツールを利用する、など目標値を達成するためには過負荷状態を作らなければいけない。疑似的に過負荷状態を作り出す必要がある。Webアプリケーションに限定されるが無料ですばらしいツールが多く提供されている。</p>

<ul>
    <li><a title="＠IT：JMeterによるWebサーバ性能評価の勘所（1/3）" href="http://www.atmarkit.co.jp/flinux/rensai/apache2_02/apache02a.html">＠IT：JMeterによるWebサーバ性能評価の勘所（1/3）</a></li>
    <li><a title="The Jakarta Site - The Jakarta Project" href="http://jakarta.apache.org/">The Jakarta Site &#8211; The Jakarta Project &#8212; Java Related Products</a></li>
    <li><a title="JMeter(高機能/フリーなテストツール)第1回：JMeterの基本" href="http://www.stackasterisk.jp/tech/engineer/jmeter01_01.jsp">JMeter(高機能/フリーなテストツール)第1回：JMeterの基本</a></li>
</ul>

<h4>試験結果</h4>

<p>負荷試験計画時の「目的と対象範囲」を達成したかどうか、
実測値が予測値より悪い場合や、目標値ギリギリの場合、チューニングを実施することになる。
問題点の原因については、計測データなどを使って</p>

<ul>
    <li> トランザクション数/クライアント数が増加しているとき、スループットの増加傾向が変化した時点</li>
    <li> レスポンスタイムが急速に遅くなった点</li>
</ul>

<p>分析するポイントとして、システムの測定値が急激に変化したとき、関連するモジュールがボトルネックと考えられる。
チューニングについては、そのようなボトルネックと予測されるモジュールから優先的に検証する必要がある。</p>

<p>以上のような点について、負荷試験の計画フェーズで考えておけば良いのではないかと考える。
負荷試験が実施されるのはシステムが構築され、結合試験も終わった以降になる。一番忙しいフェーズであるが
負荷試験の重要性を説明し、しっかりと計画をして実施していきたいと思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://labo.opengroove.com/blog/2009/08/17/%e8%b2%a0%e8%8d%b7%e8%a9%a6%e9%a8%93%e3%81%ae%e8%80%83%e3%81%88%e6%96%b9%ef%bc%88%e3%81%8a%e5%ae%a2%e6%a7%98%e3%81%b8%e8%aa%ac%e6%98%8e%e3%81%99%e3%81%b9%e3%81%8d%e3%81%93%e3%81%a8%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

