.htaccessに2000行書くとApacheの処理が何秒遅くなるか測ってみた
今日は技術的な話題です。WebサーバーとしてApacheを使っているときに、「.htaccess
」ファイルにたくさん処理を書くと重くなるといわれます。具体的に、どれぐらい遅くなるのでしょうか。試してみました。
.htaccess
に2200行ほど書くと1リクエストあたり12ミリ秒の遅延になった
一般的には、こう言われています。
.htaccess
に処理を書くと、httpd.conf
に書くのに比べて、Apacheの動作は遅くなる
実際に測定してみた結論から言うと、たしかに遅くなるようです。
具体的には、私が行ったテストでは、.htaccess
ファイルに2200行ほどの設定を書いた場合、同じアクセス制御をhttpd.conf
に書いた場合と比べて、中央値で1リクエストあたり12ミリ秒ほど遅くなりました。
致命的だとも言えませんが軽視していいとも言えない速度低下ですね。
この時間はムダなので削りたいですが、設定を変更するときの手間を考えると無視したくなる、微妙なラインです(細かい条件などは記事の最後に)。
では、なぜ.htaccess
に書く設定が増えるとApacheの動作が重くなるのかを解説しますね。
.htaccess
とhttpd.conf
は何が違うの?
まず、「.htaccess
」と「httpd.conf
」の違いを理解しましょう。
ApacheなどWebサーバーの動作を変更するには、設定をサーバーに伝えなければいけません。その手段として、主に次の2つがあります。
- 根本の設定ファイル「
httpd.conf
」などで指定する - ディレクトリごとの設定ファイル「
.htaccess
」で指定する
みなさんも、.htaccess
でリダイレクトなどの指定をしたことがあるのではないでしょうか。
.htaccess
とhttpd.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
に記述するかは、大きな違いにはつながらなさそうです。
ちなみに、同様のテストをしている方がほかにもいらっしゃいました。そちらでは、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
ソーシャルもやってます!