さくらのレンタルサーバでDEFLATE(gzip)で圧縮する
ウェブサイト(ページ)にアクセスすると、HTML、CSS、JavaScriptなど必要なリソース(データ)をサーバーからダウンロードして表示している。 サーバーから必要なデータを転送する際、最近はそのまま転送せず、いったんデータを圧縮してからクライアント(ユーザー)側へ転送しているサーバーも少なくない。
レンタルサーバー
大手のサイトなら圧縮していない方が珍しい。 最近はレンタルサーバーでも、何も設定しなくてもデフォルトで圧縮が有効になっている。
私が使用したことがあるレンタルサーバーでは、以下のような圧縮方式が使われている。
| レンタルサーバー | プラン | Content-Encoding (圧縮方式) |
| さくらのレンタルサーバ | スタンダート、ビジネス | なし |
| エックスサーバー | スタンダート | br (Brotli) |
| XServerビジネス | 共有・スタンダート | gzip |
| シンレンタルサーバー | ベーシック | br (Brotli) |
| コアサーバー | V1 CORE-A | gzip |
| コアサーバー | V2 CORE-Y | br (Brotli) |
| Oneレンタルサーバー | ベーシック | gzip |
| ConoHa | WING・ベーシック | gzip |
同じ会社でもプランによって圧縮方式が異なる場合がある。 例えばコアサーバーは V1 では gzip だが、V2 では br (Brotli) が使われている。
データの圧縮を行うレンタルサーバーが多い中、さくらのレンタルサーバはデータを圧縮していない。 さくらのレンタルサーバは、他社と比べてページの表示にやや時間がかかる印象があるかもしれないが、もしかするとデータ圧縮の有無が多少影響しているかもしれない。
ただし圧縮処理自体にも多少時間を要するため、必ずしも速くなるとは限らない。 とはいえ、その処理は一瞬なのでデータサイズが小さい方が結果的にページの表示が速くなる可能性がある。
また、さくらのレンタルサーバは転送量が無制限となっているが、gzipで圧縮することで一応データの転送量を減らせる。
さらにモバイルのデータ通信でサイトを見ている人にとっては、少しでも通信量が少ない方がありがたい。 一応モバイルフレンドリーといえるかもしれない。
Googleもページの表示速度には注目しており、リソース圧縮の重要性について 圧縮を有効にする(PageSpeed Insights - Google) に説明がある。
DEFLATE(gzip)の記述例
さくらのレンタルサーバは、デフォルトではデータが圧縮されていないが、mod_deflate(Apacheのモジュール)がインストールされているようなのでDEFLATEを使うことができる。
ただし、コントロールパネルなどには圧縮に関する項目はない。 自分で .htaccess に記述する必要がある。
なお、当記述例はさくらのレンタルサーバ以外のサーバーでも使用可能。 Brotliによる圧縮は Brotliでデータ圧縮、記述例 をご覧下さい。
SetOutputFilter DEFLATE SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico|webp|avifs?)$ no-gzip dont-vary
1行目で DEFLATE を有効にする。 これだけだと、すべてのデータが圧縮されてしまう。 画像ファイルは基本的に既に圧縮されているので、2行目で画像関連を除外している。 リクエストURIの末尾がこれらの拡張子に一致する場合、gzipが適用されないという意味。 なお、SVGは画像だが、中身はテキストなので基本的に圧縮するとファイルサイズが小さくなる。
また、以下のように個別に書くこともできる。
AddOutputFilterByType DEFLATE text/html
これは、MIMEタイプ(Content-Type)が text/html のもののみ圧縮する。
SetOutputFilter と AddOutputFilterByType を同時に書いている例も見られるが、AddOutputFilterByType のみで有効になる。 詳しくはApache公式サイト参照。
以下のように複数のMIMEタイプを指定することもできる。
AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/javascript
MIMEタイプを複数指定する場合、スペース区切りで1行で書くこともできる。
AddOutputFilterByType DEFLATE text/html text/css application/javascript
ウェブサイトでよく使うデータとしては以下のようなものがある。 ただし、SVG以外の画像を除く。 環境によってMIMEタイプが異なる場合がある。
| 主なデータ | MIMEタイプ |
| HTML | text/html |
| CSS | text/css |
| JavaScript | text/javascript |
| JavaScript | application/javascript |
| SVG | image/svg+xml |
| XML、RSSなど | application/xml |
| テキスト | text/plain |
mod_deflate がインストールされている場合のみ実行
現在さくらのレンタルサーバは mod_deflate が使える状態だが、公式には特にアナウンスがないので、もし mod_deflate が使えなくなった場合、サーバーエラーが発生する。
以下のように記述すると mod_deflate がインストールされている場合のみ実行することができる。
<IfModule mod_deflate.c> SetOutputFilter DEFLATE SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico|webp|avifs?)$ no-gzip dont-vary </IfModule>
Apache公式サイトには古いブラウザへの対応も書かれているが、現状 DEFLATE(gzip)に対応していないブラウザを使用している人はほぼいないので、気にする必要はないと思われる。
以上の設定を済ませた後、ウェブサイトにアクセスし、ブラウザのディベロッパーツール(開発ツール)を使って確認すると、Content-Encoding が gzip になっている。
その他、DEFLATE(mod_deflate)に関する解説は、Apacheのサイト DEFLATE / mod_deflate モジュール(Apache) をご覧下さい。
特定のページのみ圧縮を除外する
上記例で画像のみgzipの圧縮を除外したが、特定のページ(PHPのプログラムなど)も個別に除外できる。 以下は example.php を gzip で圧縮しない例。
SetEnvIfNoCase Request_URI example\.php$ no-gzip dont-vary