Apache で gzip のファイル圧縮転送 を設定するメモです。
設定前の動作確認
試しに Apache 2.4系 のサーバに設定してみます。
ちなみに設定前のとある WordPress のサイトのトップページを表示するとこのような感じ。
Chrome の Devtools で network タブを開いてページをリロードすると、画像のような状態に。 transferred
が 1.4MB
と表示されています。
トップページのHTMLリソースのレスポンスヘッダはこのような感じ。 Connection
と Content-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.conf
で conf.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.conf
で mod_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 をリロード。
これで設定完了です。
設定後の動作確認
さて、先程のサイトをもう一度見てみます。
今度は transferred
が 934kB
と表示されました。 約400kB くらい圧縮されました。
設定後のトップページのHTMLリソースのレスポンスヘッダ。 Connection
と Content-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.conf
や 01-cgi.conf
, 15-php.conf
というように数字2桁のプレフィックスが付いています。
Files are processed in sorted order and should have a two digit numeric prefix.
このプレフィックスは数字で順番がソートされ、 .conf
ファイル が読み込まれる順番が決まる。(そのソートのルールを保つため)プレフィックスは2桁にすべき、ということのようです。
ソート順を保つためであって、 01
や 15
の数字そのものに意味はなさそうな気がしました。
何故ここを気にしたかと言うと、最初は conf.modules.d/
に gzip圧縮 の設定ファイルを置こうとしていて、かつ deflate が元々は「空気を抜く、しぼませる」という意味なので気体にあやかって 22.4l で 224-deflate.conf
という名前にしようかと思ったためです( README
を読んで止めましたが)。
余談3
.conf
ファイル を読み込むのに、 httpd.conf
の中で Include
と IncludeOptional
の2つのディレクティブが既述されていたのでメモ。
これらの違いは「IncludeOptional
は指定されたファイルやディレクトリが存在しない場合でもエラーが発生しない」という点のようです。
参考
gzip圧縮
- Apache gzipでファイルを圧縮して転送する | ITSakura
- 【初心者向け】Apacheでgzip – Qiita
- 【Apache】gzip圧縮してみる(帯域対策、Webサイト高速化) at softelメモ
SetOutputFilter
: core – Apache HTTP サーバ バージョン 2.4