Apache HTTPのmod_deflateによる通信量削減

Amazon Web Services (AWS) やGoogle Compute Engine (以下GCE) などで簡単にサーバインスタンスを立ち上げることができるようになりました。 これらのサーバインスタンスタイプも様々なものがあり、安価なものも利用することができます。しかし、必要な料金はサーバインスタンスに対してだけでなく、その通信量に対しても料金が発生します。そのため通信量の削減も行う必要があります。今回は、Apache HTTPのmod_deflateを利用した方法を紹介します。mod_deflateは通信内容をgzipで圧縮してくれるので、結果的に通信量削減につながります。ここで、WebサーバはGCEで立ち上げたCentOS7としました。

Webサーバの用意

以前紹介したGCEの記事を参考に、CentOS7のサーバインスタンスを作成して下さい。Webサーバとして用意するため、作成時に「HTTPトラフィックを許可する」をチェックすること忘れないで下さい。

Apache HTTPのインストール

サーバが立ち上がったらApache HTTPをインストールします。
$ sudo yum update
$ sudo yum install -y httpd
$ sudo systemctl start httpd
行っている作業は順番に以下の通りです。
  • yum updateでインストール済みのパッケージを更新
  • Apache HTTPのインストール
  • Apache HTTPの起動

テスト用HTMLの作成

テスト用HTMLの設置は、Apache HTTPデフォルトで設定されているフォルダにindex.htmlとして配置します。ここで用意したテスト用HTMLは、bodyタグ内に20kB分の文字列記述した内容です。
$ sudo vi /var/www/html/index.html
ここまでは、まだ通信内容を圧縮していません。この状態で、通信の状態を確認してみましょう。確認には次のサービスを利用します。 port80 software https://www.port80software.com/support/p80tools port80 software   Evaluation Toolsの中にCompression Checkとありますので、テキストボックスにサーバのIPアドレスを入力し、「Check」ボタンを押下しましょう。結果、次のような表示となりました。 gzip result 「Compression status(圧縮状態)」の項目に「Uncompressed(未圧縮)」と表示されていることがわかります。また「Original size」と「Size if compressed」が「21068 bytes」と記されており、こちらからも圧縮されていないことがわかります。もちろん、データ圧縮の設定を行っていないので、このような結果になります。

mod_deflateの有効化

それではmod_deflateを利用しましょう。CentOS7のApache HTTPでは、デフォルトでmod_deflateが読み込まれています。その読み込み設定は「/etc/httpd/conf.modules.d/00-base.conf」に記されています。
LoadModule deflate_module modules/mod_deflate.so
そのため、あとはmod_deflateを利用する設定を追加すれば大丈夫です。その利用設定は「/etc/httpd/conf.d/mod_deflate.conf」を新規に作成し記しましょう。
$ sudo vi /etc/httpd/conf.d/mod_deflate.conf
まずは特別な設定なく単純にmod_deflateを利用しましょう。下記の内容を記述し保存して下さい。
<IfModule mod_deflate.c>
    SetOutputFilter DEFLATE
</IfModule>
「SetOutputFilter DEFLATE」がmod_deflateを利用する設定に当たります。そしてApache HTTPを再起動します。
$ sudo systemctl restart httpd
これでmod_deflateの準備が整いました。再度port80 softwareにアクセスし、圧縮状態を確認しましょう。結果、次のように記されました。 gzip result 「Compression status(圧縮状態)」の項目に「Compressed (gzip)」と表示されていることがわかります。また「Original size」が「21068 bytes」であるのに対して、「Compressed size」が「184 bytes」と1/100以下に圧縮されていることがわかります。今回はテスト用HTMLであったため、圧縮率が約100%となりましたが、テキスト形式であれば通常でも50%前後の圧縮率になります。 一方、デメリットもあります。それはmod_deflateで圧縮するため、サーバのCPU使用率が上がります。しかし、データ圧縮のメリットとCPU使用率のデメリットを比べると、圧倒的にメリットのほうが高いものと思われます。 また、先に紹介した設定は、全てのファイルを圧縮するものです。つまり既に圧縮されているjpegやpng画像形式も再圧縮することになります。2重に圧縮することはスマートではないので、圧縮済みの画像ファイルは対象から外しましょう。「/etc/httpd/conf.d/mod_deflate.conf」を次のように変更します。
<IfModule mod_deflate.c>
    SetOutputFilter DEFLATE
    SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip
</IfModule>
「SetEnvIfNoCase Request_URI」の設定により、指定URLをmod_deflateの対象から外すことができます。ここでは、git, jpeg, jpg, pngを対象から外す設定にしました。それではApache HTTPを再起動し、port80 softwareにアクセスし画像ファイルを指定しましょう。 gzip result 「Compression status」が「Uncompressed」と表示され、圧縮対象から外れていることがわかるでしょう。静的なコンテンツを提供するだけであれば、上記の設定でも問題ないと思います。もしシステム開発を行い動的なコンテンツを配信しているのであれば、もっと細かな設定が必要になることに注意して下さい。

まとめ

今回はApache HTTPのmod_deflateによる通信量削減の方法を紹介しました。決して難しいものではなく、ちょっとした設定で絶大な効果が得られることが判って頂けたものと思います。実は私も過去にJavaScriptからAjaxでリクエストしたデータが、膨大なものになっておりレスポンスが悪いということを経験しました。そのときmod_deflateの存在を知ったのですが、意図も簡単に対応できてしまったことに感動を覚えました。ぜひこの感動をエンジニアの皆様にも味わっていただきたいです。
» エンジニア登録はこちら