IBM HTTP Server for i で応答の圧縮を比較した

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')` で確認できます。

```.sh:実行結果
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
- [IBM HTTP Server for i メインページ](https://www.ibm.com/docs/ja/i/7.5?topic=serving-http-server)
- [IHS PDF マニュアル](https://www.ibm.com/docs/ja/ssw_ibm_i_75/pdf/rzaiepdf.pdf)

## 圧縮を使用する設定
今回は **deflate_module([gzip](https://ja.wikipedia.org/wiki/Gzip))** と **brotli_module([Brotli](https://ja.wikipedia.org/wiki/Brotli))** をします。

>テキストファイルを圧縮する局面において、Brotli は一般的に Deflate に対し 20% 程の圧縮率の優越を、圧縮/伸長速度におおかた変化なく行うことができる

と記載のとおり **DEFLATE** に対して圧縮率の優位性がありそうです。**Brotli** はモダンなブラウザでは実装されているため、有効にしているとこちらが使用されます。 **Brotli** の実装がないブラウザの場合はフォールバックとして **DEFLATE** が働きます。
まずそれぞれの圧縮を使用するには、`httpd.conf` ファイルに **deflate_module** と **brotli_module** をロードする設定を追記します。

```.conf:httpd.conf
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** を追記します。この設定により圧縮率が変わり、圧縮／解凍に要するオーバーヘッドと転送容量に影響します。

```.conf:httpd.conf
<VirtualHost *:xxxxx>
～～～中略～～～
  # DEFLATE圧縮レベル（1: 低圧縮、9: 高圧縮）Server config, Virtual Host
  DeflateCompressionLevel 6
  # Brotli圧縮レベル（0: 低圧縮、11:高圧縮）Server config, Virtual Host
  BrotliCompressionQuality 6

</VirtualHost>
```

続いて、サーバー設定、バーチャルサーバー設定、ディレクトリ、htaccess レベルの何れかに **AddOutputFilterByType** を追記します。ここでは圧縮対象とするコンテンツタイプを指定します。

```.conf:httpd.conf
<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** の３パターンで取得して、それぞれ転送容量と所要時間を比較してみました。平均値を見るために 10 回程度の取得をしています。

|パターン|転送容量|平均所要時間|
|---|---|---|
|無圧縮| 1.7 MB | ≒ 1.85 秒|
|DEFLATE(gzip)| 245 KB | ≒ 430 ミリ秒|
|Brotli| 178 KB | ≒ 360 ミリ秒|

**■ブラウザのスクショ**

![2024-12-18_204854.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100029/b069d0aa-daa4-f140-242e-a59cf8812aef.png)

上記をみると無圧縮に比べ圧縮した場合は転送量がかなり低減されてます。**Brotli** では無圧縮の 1/10 程度となっています。
ネットワーク帯域が限られた場合では、圧縮／解凍のオーバーヘッドより転送効率の方が勝り、圧縮の効果が見込めそうです。

## 帯域を無制限にした場合はどうだったか？

実際に今回行った検証場所は、中部システム社内の有線 LAN 環境でした。社内はギガビットで構成されているため、帯域無制限にした場合は、圧縮／解凍のオーバーヘッドがボトルネックとなり、無圧縮が速いケースもありました。
何でもかんでも圧縮すれば良いわけではなく、環境や状況、転送データの性質に応じて上手く使いこなす事が大事ですね。