IBM i のライセンス 5770DG1 で提供されている IBM HTTP Server for i (略 : IHS) があります。この IHS で利用可能な圧縮方法 deflate_module と brotli_module を試してみました。
Brotli は Chrome や Firefox では、HTTPS 接続を使用した時にリクエストされます。
検証環境
- IBM i ハードウェア : Power10 S1014
- OS : V7R5
- IHS PTF : SF99952(IBM HTTP SERVER FOR I) LVL 17
- Server version: Apache/2.4.53 (IBM i)
- ジョブCCSID : 5035
- ブラウザ:MS Edge(131.0.2903.99)
- 想定帯域:4G LTE 高速
IBM i で IHS のバージョンを確認する場合は次のコマンド STRTCPSVR SERVER(*HTTP) HTTPSVR(APACHEDFT '-V')
で確認できます。
Server version: Apache/2.4.53 (IBM i)
Server built: Apr 11 2022 07:47:17
Server's Module Magic Number: 20120211:124
~~~中略~~~
-D SERVER_CONFIG_FILE="conf/httpd.conf"
参考URL
圧縮を使用する設定
今回は deflate_module(gzip) と brotli_module(Brotli) をします。
テキストファイルを圧縮する局面において、Brotli は一般的に Deflate に対し 20% 程の圧縮率の優越を、圧縮/伸長速度におおかた変化なく行うことができる
と記載のとおり DEFLATE に対して圧縮率の優位性がありそうです。Brotli はモダンなブラウザでは実装されているため、有効にしているとこちらが使用されます。 Brotli の実装がないブラウザの場合はフォールバックとして DEFLATE が働きます。
まずそれぞれの圧縮を使用するには、httpd.conf
ファイルに deflate_module と brotli_module をロードする設定を追記します。
LoadModule zend_enabler_module /QSYS.LIB/QHTTPSVR.LIB/QZFAST.SRVPGM
~~~中略~~~
# 圧縮モジュールの追加
LoadModule deflate_module /QSYS.LIB/QHTTPSVR.LIB/QZSRCORE.SRVPGM
LoadModule brotli_module /QSYS.LIB/QHTTPSVR.LIB/QZSRCORE.SRVPGM
続いて、サーバー設定またはバーチャルサーバー設定レベルの何れかに DeflateCompressionLevel と BrotliCompressionQuality を追記します。この設定により圧縮率が変わり、圧縮/解凍に要するオーバーヘッドと転送容量に影響します。
<VirtualHost *:xxxxx>
~~~中略~~~
# DEFLATE圧縮レベル(1: 低圧縮、9: 高圧縮)Server config, Virtual Host
DeflateCompressionLevel 6
# Brotli圧縮レベル(0: 低圧縮、11:高圧縮)Server config, Virtual Host
BrotliCompressionQuality 6
</VirtualHost>
続いて、サーバー設定、バーチャルサーバー設定、ディレクトリ、htaccess レベルの何れかに AddOutputFilterByType を追記します。ここでは圧縮対象とするコンテンツタイプを指定します。
<Directory "/www/hogehoge/htdocs">
~~~中略~~~
# DEFLATEの対象タイプ設定
AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/x-javascript application/json application/xml application/x-httpd-php
# Brotli対象タイプ設定 Server config, Virtual Host, Directory, .htaccess
AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/css application/javascript application/x-javascript application/json application/xml application/x-httpd-php
</Directory>
設定が完了したら IHS インスタンス を STRTCPSVR SERVER(*HTTP) RESTART(*HTTP) HTTPSVR(HOGE)
コマンドで再起動します。
圧縮の検証
今回は、5,000 件のXML(1.6 MB) を 無圧縮、DEFLATE 、Brotli の3パターンで取得して、それぞれ転送容量と所要時間を比較してみました。平均値を見るために 10 回程度の取得をしています。
パターン | 転送容量 | 平均所要時間 |
---|---|---|
無圧縮 | 1.7 MB | ≒ 1.85 秒 |
DEFLATE(gzip) | 245 KB | ≒ 430 ミリ秒 |
Brotli | 178 KB | ≒ 360 ミリ秒 |
■ブラウザのスクショ
上記をみると無圧縮に比べ圧縮した場合は転送量がかなり低減されてます。Brotli では無圧縮の 1/10 程度となっています。
ネットワーク帯域が限られた場合では、圧縮/解凍のオーバーヘッドより転送効率の方が勝り、圧縮の効果が見込めそうです。
帯域を無制限にした場合はどうだったか?
実際に今回行った検証場所は、中部システム社内の有線 LAN 環境でした。社内はギガビットで構成されているため、帯域無制限にした場合は、圧縮/解凍のオーバーヘッドがボトルネックとなり、無圧縮が速いケースもありました。
何でもかんでも圧縮すれば良いわけではなく、環境や状況、転送データの性質に応じて上手く使いこなす事が大事ですね。