Apache で gzip のファイル圧縮転送 を設定する

Apache で gzip のファイル圧縮転送 を設定するメモです。

設定前の動作確認

試しに Apache 2.4系 のサーバに設定してみます。

ちなみに設定前のとある WordPress のサイトのトップページを表示するとこのような感じ。

Chrome の Devtools で network を見る。 transferred が 1.4MB あることが分かる。
Chrome の Devtools で network を見る。 transferred が 1.4MB あることが分かる。

Chrome の Devtools で network タブを開いてページをリロードすると、画像のような状態に。 transferred1.4MB と表示されています。

トップページのHTMLリソースのレスポンスヘッダ
トップページのHTMLリソースのレスポンスヘッダ

トップページのHTMLリソースのレスポンスヘッダはこのような感じ。 ConnectionContent-Type が隣接しています。

設定変更

設定する前にいくつか確認を。

# cd /etc/httpd/
# cd ./modules/
# ls
libphp7-zts.so          mod_deflate.so              mod_proxy_express.so
libphp7.so              mod_dialup.so               mod_proxy_fcgi.so

## 略                   ## 略                       ## 略

まずは gzip圧縮に必要なモジュール mod_deflate.so があることを確認。

# cd ../

# less ./conf/httpd.conf


## 略

Include conf.modules.d/*.conf

## 略

IncludeOptional conf.d/*.conf

次に httpd.confconf.modules.d/ディレクトリ下 の .confファイル と conf.d/ディレクトリ下 の .confファイル を読み込む設定になっていることを確認。

# cd ../conf.modules.d/

# less 00-base.conf


## 略

LoadModule deflate_module modules/mod_deflate.so

続いて conf.modules.d/00-base.confmod_deflate.so がロードされるようになっていることを確認。

# cd ../conf.d/

# vi deflate.conf


# This file is config of deflate_module.

<IfModule mod_deflate.c>
      SetOutputFilter DEFLATE

      AddOutputFilterByType DEFLATE text/plain
      AddOutputFilterByType DEFLATE text/html
      AddOutputFilterByType DEFLATE text/xml
      AddOutputFilterByType DEFLATE text/css
      AddOutputFilterByType DEFLATE text/javascript
      AddOutputFilterByType DEFLATE application/xhtml+xml
      AddOutputFilterByType DEFLATE application/xml
      AddOutputFilterByType DEFLATE application/rss+xml
      AddOutputFilterByType DEFLATE application/atom_xml
      AddOutputFilterByType DEFLATE application/javascript
      AddOutputFilterByType DEFLATE application/json
      AddOutputFilterByType DEFLATE application/ld+json
      AddOutputFilterByType DEFLATE application/x-javascript
      AddOutputFilterByType DEFLATE application/x-httpd-php
</IfModule>

ここまでを確認したら、 conf.d/deflate.conf ファイルを作成して設定を記述します。

テキストファイルで、通信することがありえそうなものを入れてみました。

# ls -al


## 略

-rw-r--r-- 1 ADMIN_USER ADMIN_USER    857 mm dd hh:ii deflate.conf

## 略

-rw-r--r-- 1 ADMIN_USER ADMIN_USER   1254 MM dd  yyyy php.conf
-rw-r--r-- 1 ADMIN_USER ADMIN_USER   9465 MM dd  yyyy ssl.conf

## 略

念のため権限を確認。元々存在する php.conf 等と比較しておきます。

# systemctl reload httpd
#

Apache をリロード。

これで設定完了です。

設定後の動作確認

さて、先程のサイトをもう一度見てみます。

設定後の Devtools。 transferred が 934kB に変化した。
設定後の Devtools。 transferred が 934kB に変化した。

今度は transferred934kB と表示されました。 約400kB くらい圧縮されました。

設定後のトップページのHTMLリソースのレスポンスヘッダ
設定後のトップページのHTMLリソースのレスポンスヘッダ

設定後のトップページのHTMLリソースのレスポンスヘッダ。 ConnectionContent-Type の間に Content-Encoding: gzip が追加されたことが確認できました。


表示速度は気持ち速くなったかな、くらいですが、転送容量を見ると gzip圧縮 は効いていることが確認できました。

ちなみに、 gzip圧縮 の設定をすると転送量は小さくなりますがその分サーバ側で処理をするため、容量の大きなファイルや元々圧縮されているファイルを圧縮すると余計な負荷がかかって逆効果なことも考えられます。

そのため、MIMEタイプの設定で画像ファイル等は除外しています。

余談

余談1

今回の gzip圧縮 の設定ファイルの置き場所について conf.d/conf.modules.d/ か迷ったのですが、 conf.modules.d/README を読むと

# less conf.modules.d/README

This directory holds configuration files for the Apache HTTP Server;
any files in this directory which have the ".conf" extension will be
processed as httpd configuration files.  This directory contains
configuration fragments necessary only to load modules.
Administrators should use the directory "/etc/httpd/conf.d" to modify
the configuration of httpd, or any modules.

Files are processed in sorted order and should have a two digit
numeric prefix.  See httpd.conf(5) for more information.

ということで、 conf.d/ にしました。

余談2

上記の README に記載がありますが、 conf.modules.d/.conf ファイルは 00-base.conf01-cgi.conf, 15-php.conf というように数字2桁のプレフィックスが付いています。

Files are processed in sorted order and should have a two digit numeric prefix.

このプレフィックスは数字で順番がソートされ、 .confファイル が読み込まれる順番が決まる。(そのソートのルールを保つため)プレフィックスは2桁にすべき、ということのようです。

ソート順を保つためであって、 0115 の数字そのものに意味はなさそうな気がしました。

何故ここを気にしたかと言うと、最初は conf.modules.d/ に gzip圧縮 の設定ファイルを置こうとしていて、かつ deflate が元々は「空気を抜く、しぼませる」という意味なので気体にあやかって 22.4l で 224-deflate.conf という名前にしようかと思ったためです( README を読んで止めましたが)。

余談3

.confファイル を読み込むのに、 httpd.conf の中で IncludeIncludeOptional の2つのディレクティブが既述されていたのでメモ。

これらの違いは「IncludeOptional は指定されたファイルやディレクトリが存在しない場合でもエラーが発生しない」という点のようです。

参考

gzip圧縮

MIMEタイプ

Include と IncludeOptional

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。