gzip圧縮を有効にしてWebサイトのページ読み込みスピードを改善させる

サイト上のデータ、たとえばHTMLファイルやCSS、Javascriptなどを生のままでなく圧縮してやると、転送するデータ量が少なくなりページの表示が早くなるという理屈です。

圧縮して転送出来ることを、最近Googleのツールである PageSpeed Insights でチェックして初めて知りました。
ちなみに圧縮していないと、こんな感じで怒られる。
image-20150624014943.png

このサイトデータを圧縮することにより、転送量を減らしてスピードアップする方法は、サーバーがApache モジュール「mod_deflate」に対応していたら非常に簡単です。
.htaccess に以下の記述を追記するだけで対応できます。
(参考ソース :Apacheのmod_deflateでコンテンツを圧縮してサイトを高速化する方法

<IfModule mod_deflate.c>
 SetOutputFilter DEFLATE
 
 # Mozilla4系などの古いブラウザで無効、しかしMSIEは除外
 BrowserMatch ^Mozilla/4\.0[678] no-gzip
 BrowserMatch ^Mozilla/4 gzip-only-text/html
 BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
 
 # gifやjpgなど圧縮済みのコンテンツは再圧縮しない
 SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary
 SetEnvIfNoCase Request_URI _\.utxt$ no-gzip
 
 # htmlやcssなどは圧縮
 AddOutputFilterByType DEFLATE text/plain
 AddOutputFilterByType DEFLATE text/html
 AddOutputFilterByType DEFLATE text/xml
 AddOutputFilterByType DEFLATE text/css
 AddOutputFilterByType DEFLATE application/xhtml+xml
 AddOutputFilterByType DEFLATE application/xml
 AddOutputFilterByType DEFLATE application/rss+xml
 AddOutputFilterByType DEFLATE application/atom_xml
 AddOutputFilterByType DEFLATE application/x-javascript
 AddOutputFilterByType DEFLATE application/x-httpd-php
</IfModule>

しかしながら、注意しておきたい点としては、サーバー側でアクセスがあるたびに圧縮作業が行われるので、当然それに伴ってサーバーのCPU使用率がアップします。サーバーによっては、負荷がかかり過ぎて逆にスピードが落ちてしまうことも十分考えられますので、実装時にはテストをおこなってしばらく様子をみるようにしてください。

このサイトのレンタルサーバーである、さくら スタンダードプランではmod_deflateに対応していたので、上記の方法で簡単に実装できましたが、他のサイトでレンタルしているサーバー、Webarena SuiteXではmod_deflateモジュールが使用できませんでした。
SuiteXに限らず、このmod_deflateモジュールを使用できないレンタルサーバーは結構あると思います。
そういう場合はどうするか。僕は以下の方法で対応しました。

mod_deflateモジュールが使えないなら、自分でgzip圧縮したファイルをアップロードし、これを読み込ませるという方法です。
でも全部のファイルを圧縮するなんてことは運用上問題が出てくるので、画像やHTMLファイルなどの更新頻度の高いデータの圧縮はあきらめて、あまり更新することのないCSSやJavascriptだけをgzip圧縮し、少しでもページスピードの効果を得るようにしました。
手順としては、以下の通り。

1. ファイルをgzip圧縮する

gzip圧縮できるツール(7-ZipCubeICEなど)でCSSやJavascriptファイルを圧縮します。

2. gzip圧縮したファイルをアップロードする

圧縮したファイルは、元のファイルはそのままで、同じ場所にアップロードしてください。
例えば、/css/style.css をgzip圧縮してアップロードすると、以下のように二つファイルがあることになります。

/css/style.css
/css/style.css.gz

一点注意しておきたいことは、今後 style.css を更新する度に、合わせて再度gzip圧縮した style.css.gz もアップロードしなおすことが必要になります。

3. .htaccess に追記する

以下の記述を .htaccess ファイルに追記してください。

RewriteEngine on
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME} \.js$ [OR]
RewriteCond %{REQUEST_FILENAME} \.css$
RewriteCond %{REQUEST_FILENAME} !\.gz$
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule .+ %{REQUEST_URI}.gz

<FilesMatch "\.js\.gz$">
 ForceType application/x-javascript
 AddEncoding x-gzip .gz
</FilesMatch>

<FilesMatch "\.css\.gz$">
 ForceType text/css
 AddEncoding x-gzip .gz
</FilesMatch>

最後に、gzip圧縮がちゃんと動いているのか確認してください。

サイト全体では、PageSpeed Insights で点数が改善していれば問題ないと思います。
個別にチェックしたい場合は、GIDZipTest で確認してみてください。