huguma’s blog (仮)

IT技術関連中心の備忘録

Apacheサーバのgzip圧縮最適化: 2. 設定方法

  1. 確認方法
  2. 設定方法
  3. 事前圧縮による最適化
  4. 補足: ファイルのgzip圧縮(初級編)

サーバの対応方法

サーバがファイルをgzip圧縮して返信する場合の対応方法は2種類あります。

  1. 要求を受信したサーバがその場でgzip圧縮を行い返信する
  2. あらかじめgzip圧縮しておき、それを返信する

設定は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_で始まる名前は拡張モジュールを表します。これらはもともと拡張機能扱いだったものですが、今では大部分が標準的なディストリビューションに最初から含まれています。

モジュール一覧: http://httpd.apache.org/docs/current/ja/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-gzipgzip圧縮を制御するための特別な環境変数で、設定すると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|...)と同じですが、キャプチャをしない分だけ若干効率が向上します。

SetEnvIfNoCaseSetEnvIfのバリエーションで、大文字と小文字を同一と見なして処理すること以外は同じです。これで大文字の.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で追加設定する手順で対応できます。

続く ⇒ Apacheサーバのgzip圧縮最適化: 3. 事前圧縮による最適化