Apacheサーバのgzip圧縮最適化: 2. 設定方法
サーバの対応方法
サーバがファイルをgzip圧縮して返信する場合の対応方法は2種類あります。
設定は1の方が簡単です。しかしサーバが要求を受信するたびに毎回gzip圧縮処理を行うためサーバに負荷が発生します。
一方2はファイルをgzip圧縮しておく事前準備が必要です。しかし運用時にgzip圧縮処理によるサーバ負荷は発生しません。手間は掛かりますがこの方法が最も効率的に処理できます。
具体的な設定方法はサーバソフトウエアの種類によって異なりますが、ここでは今回設定したApacheの場合を解説します。
Apacheの設定
Apacheではサーバの各種設定をhttpd.conf
、.htaccess
の2種類のファイルで記述します。
リファレンス: https://httpd.apache.org/docs/current/ja/configuring.html
(参考用)詳細解説: https://murashun.jp/blog/20141229-01.html
メインの設定ファイルは通常httpd.conf
という名前で、多くの場合は/etc/httpd/conf/httpd.conf
などの場所にあります。
ファイル名と場所(パス)はApacheのインストール(またはビルド)時に自由に設定できます。でも今ではほぼ標準的な規則(convension)があり、大部分の人はそれに従っています(詳しくは
httpd.conf 場所
で検索)。
ディレクトリ個別に設定する場合は.htaccess
を用います。このファイルは任意の場所に複数置くことができ、その位置から先のディレクトツリー全体に対して作用します。
- httpd.confと.htaccessで同じ項目で異なる設定をしている場合は.htaccessが優先(オーバーライド)します
- .htaccessが複数ある場合は内側が外側の設定をオーバーライドします
レンタルサーバの場合は通常http.confは業者側で管理しており、自分では設定できません。業者側のメイン設定は通常非公開ですが、多くの設定は.htaccessでオーバーライドして修正できます。
mod_deflateによるサーバサイド圧縮
Apacheにはmod_deflateモジュールを使ってサーバ側で圧縮処理を行う機能があり、.htaccess(またはhttpd.conf)に記述すれば対応できます。まず次のリファレンスの冒頭部から読むのが分かりやすいでしょう。
https://httpd.apache.org/docs/current/ja/mod/mod_deflate.html
Apacheでは
mod_
で始まる名前は拡張モジュールを表します。これらはもともと拡張機能扱いだったものですが、今では大部分が標準的なディストリビューションに最初から含まれています。
特定のタイプだけ簡単に圧縮したい場合は最初の文例をまねて書けばそれで十分です。必要に応じてtext/css
など自分で追加すれば機能します。
AddOutputFilterByType DEFLATE text/html text/plain text/xml
もっと詳しい設定は次の「画像以外全て圧縮する」コード例がよい参考になりますが、これは大昔(少なくとも15年以上前)のブラウザに対応するためのコードです。ブラウザ別処理の部分は今はもう省略していいと思います。
ここではリファレンスの例を最小限まで簡略化したものを示します。Apacheの専用書式で記述しますが、やはり#
から行末まではコメントです(念のため)。実質たった2行ですが正確に把握するにはリファレンスを隅々まで確認する必要があります。
# Insert filter SetOutputFilter DEFLATE # Don't deflate pre-compressed files SetEnvIfNoCase Request_URI \.(?:gz|gif|jpg|jpeg|png|mp3|ogg|pdf)$ no-gzip
まずApacheでは送受信データに対する処理をフィルタといい、出力のフィルタはSetOutputFilter
で設定します。
http://httpd.apache.org/docs/current/ja/mod/core.html#setoutputfilter
Apacheの出力用フィルタはINCLUDESとDEFLATEの2種類あります。DEFLATEはmod_deflateモジュールの機能を使いファイルをgzip圧縮します。
http://httpd.apache.org/docs/current/ja/filter.html
SetOutputFilter DEFLATE
これだけだと全てのファイルタイプを圧縮することになります。特定の拡張子を除外する設定が必要ですが、この部分のメカニズムがApacheはやや複雑です。
Apacheでは操作の各種制御に環境変数という名前付き変数を用います(OSの環境変数とは無関係)。no-gzip
はgzip圧縮を制御するための特別な環境変数で、設定するとDEFLATEフィルタをOFFにします。
http://httpd.apache.org/docs/current/env.html#special
特定の拡張子を検出して環境変数を設定するにはSetEnvIf
を用います。
http://httpd.apache.org/docs/current/ja/mod/mod_setenvif.html#setenvif
ここではRequest_URI
(URLのスキームから後ろ全て)に正規表現マッチを用い、末尾の拡張子を検出して判定しています。
http://httpd.apache.org/docs/current/ja/mod/mod_setenvif.html
SetEnvIfNoCase Request_URI \.(?:gz|gif|jpg|jpeg|png|mp3|ogg|pdf)$ no-gzip
正規表現の
(?:A|B|...)
はキャプチャなしのグループ化です。マッチ条件は(A|B|...)
と同じですが、キャプチャをしない分だけ若干効率が向上します。
SetEnvIfNoCase
はSetEnvIf
のバリエーションで、大文字と小文字を同一と見なして処理すること以外は同じです。これで大文字の.GIF
や.MP3
なども除外対象とすることができます。
http://httpd.apache.org/docs/current/ja/mod/mod_setenvif.html#setenvifnocase
説明は以上です。自前でApacheサーバを立てる場合はこれをhttpd.confに記述するのが一般的な方法です。レンタルサーバの場合は自分が管理する起点のディレクトリに.htaccessで記述すれば設定できます。
レンタルサーバの場合
なおレンタルサーバでは業者側(httpd.conf)であらかじめ基本的なファイルタイプに対して設定してくれているケースが多いようです。
今回利用したロリポップのサーバではhtml, htm, js, css, txtに対して設定されているのを確認しています(2015年11月現在)。他のタイプは確認していませんので必要な場合は自分で行って下さい。
必要な設定がされていれば何もする必要はありませんが、詳細は業者で当然異なりますから実際にブラウザで確認することをお勧めします。ファイルをアップロードしてブラウザで読み込み確認し、必要なファイルタイプを.htaccessで追加設定する手順で対応できます。