初代編集長ブログ―安田英久

.htaccessに2000行書くとApacheの処理が何秒遅くなるか測ってみた

Apache Webサーバーでは、「.htaccess」ファイルにたくさん処理を書くと重くなるといわれます。どれぐらい遅くなるのでしょうか
Web担のなかの人

今日は技術的な話題です。WebサーバーとしてApacheを使っているときに、「.htaccess」ファイルにたくさん処理を書くと重くなるといわれます。具体的に、どれぐらい遅くなるのでしょうか。試してみました。

.htaccessに2200行ほど書くと1リクエストあたり12ミリ秒の遅延になった

一般的には、こう言われています。

.htaccessに処理を書くと、httpd.confに書くのに比べて、Apacheの動作は遅くなる

実際に測定してみた結論から言うと、たしかに遅くなるようです。

具体的には、私が行ったテストでは、.htaccessファイルに2200行ほどの設定を書いた場合、同じアクセス制御をhttpd.confに書いた場合と比べて、中央値で1リクエストあたり12ミリ秒ほど遅くなりました

致命的だとも言えませんが軽視していいとも言えない速度低下ですね。

この時間はムダなので削りたいですが、設定を変更するときの手間を考えると無視したくなる、微妙なラインです(細かい条件などは記事の最後に)。

では、なぜ.htaccessに書く設定が増えるとApacheの動作が重くなるのかを解説しますね。

.htaccesshttpd.confは何が違うの?

まず、「.htaccess」と「httpd.conf」の違いを理解しましょう。

ApacheなどWebサーバーの動作を変更するには、設定をサーバーに伝えなければいけません。その手段として、主に次の2つがあります。

  • 根本の設定ファイル「httpd.conf」などで指定する
  • ディレクトリごとの設定ファイル「.htaccess」で指定する
※実際にはPHPなどのスクリプト言語から設定を変更できますが、今回は純粋なApacheの動作に関する話題ですので省きます。

みなさんも、.htaccessでリダイレクトなどの指定をしたことがあるのではないでしょうか。

.htaccesshttpd.confには、次のような違いがあります。

  • httpd.conf」などの設定ファイルはサーバー管理者しか変更できないが、「.htaccess」はコンテンツ管理者が変更できる
  • httpd.conf」はサーバーの起動時に1回読み込まれるだけだが、「.htaccess」はアクセスごとにファイルが読み込まれる

httpd.conf」で指定したサーバーの設定を、ディレクトリごとに変更するための仕組みが「.htaccess」ですね。ただ、.htaccessはサーバー管理者以外でも内容を変更できるため、サイトのルートディレクトリに置いてサイト全体の挙動を変更するという使われ方も多くあります。

共用レンタルサーバーを使っている場合や、現場の制作会社の人やWeb担当者さんが使うのは、多くの場合.htaccessでしょう。

.htaccessでは、主に次のような設定を行うことが多いようです。

  • アクセス制限(特定のIPアドレスやパスワードを知っている人のみにアクセスを制限)
  • リダイレクト(別のURLにブラウザを誘導)
  • リライト(指定されたURLを内部的に変更して処理)
  • HTTPレスポンスヘッダー(Expiresなどのキャッシュ指定やMIMEタイプなどを指定)

.htaccessはなぜ遅い?

では、.htaccessに設定を記述すると、なぜ遅くなるのでしょうか。

それは前述のように、リクエストがあるたびに.htaccessを探し、読み込み、処理する必要があるからですね。

httpd.confに設定を書いた場合、設定の読み込みはサーバーの起動時に終了しています。

それに対して、.htaccessの内容は毎回読み込まれるので、その分遅くなるということですね。

ですので、.htaccessに設定を記述することの影響度合いは、サーバーCPU・ディスクの速度・ディスクキャッシュの状況などによって、このテストとは大きく変わってくる可能性があります。

いっぽう、各リクエストに対してアクセス権やリダイレクトなどを処理するのにかかる時間は、.htaccessでもhttpd.confでも変わりはないはずです。

ですから、どんな処理を.htaccessに記述するかは、大きな違いにはつながらなさそうです。

ただ、試しにランダムなRewriteRuleを2000行追加しても速度の低下はほぼ起きなかったんですよね。ですから、ディレクティブによる違いはあるかもしれません(テストの時期が違うので、この記事には詳細を記載しませんでしたが)。

ちなみに、同様のテストをしている方がほかにもいらっしゃいました。そちらでは、fuelphpのデフォルト.htaccessの内容をhttpd.confに映したところ、ab(Apacheのベンチマークツール)での測定で1秒あたりの処理可能リクエスト数が12.5%向上したというものでした。

こちらは.htaccess自体をなくしているようですので、また違う感じですね。

つまり、どうすればいいの?

5ミリ秒でも10ミリ秒でもスピードアップしたい場合は、サーバー管理者に依頼できるのであれば、可能な限り.htaccessではなくhttpd.confを使いましょう。

可能ならば、.htaccessを一切使わず、Apacheの設定も.htaccessを探さないようにするのが、最も速いはずです。

ただし、その変更によってどれだけ高速化するかは、サーバーの環境にもよりますので、必ずテストして検証してください。

また、修正が必要になった場合の対応のしやすさも考えながら決定しましょう。

調査の詳細

今回の調査は、次のような条件で行いました。

  • サーバーはVPS、OSはCentOS 7、Apacheのバージョンは2.4.6
  • Apacheの仮想ホストのドキュメントルートに配置した.htaccessを使用
  • 当該行以外には.htaccessに500行ほどの記載あり
  • アクセス制御のためのdeny fromによるCIDR指定1789行(コメントなども含め行数で2200行)を、.htaccessに書いた場合とhttpd.confに書いた場合をそれぞれ測定
  • 測定は、別ネットワークにあるWindows端末上のChromeを使い、Developer Toolで測定
  • リクエストは1.3KBの画像で試行
  • ブラウザのキャッシュは無効にした状態で、TCP接続後のTTFB(最初の1バイトが届くまでの時間)を測定
  • それぞれの条件で20回ずつ測定し、中央値で比較
  • httpd.confに記載の場合の詳細は次のとおり:中央値51.0ms、平均値50.8ms、標準偏差2.67
  • .htaccessに記載の場合の詳細は次のとおり:中央値63.0ms、平均値63.3ms、標準偏差3.91
この記事が役に立ったらシェア!
メルマガの登録はこちら Web担当者に役立つ情報をサクッとゲット!

人気記事トップ10(過去7日間)

今日の用語

SSL
「SSL」(Secure Sockets Layer)は、Webサイトを閲覧する ...→用語集へ

インフォメーション

RSSフィード


Web担を応援して支えてくださっている企業さま [各サービス/製品の紹介はこちらから]