Webサイトの表示速度は、ユーザーエクスペリエンスやSEOにとって極めて重要な要素です。特に、現代のWebサイトでは大容量のJavaScriptやCSSファイルが多用されるため、効率的なファイル圧縮は必須の技術となっています。
今回は、Nginxにおけるgzip圧縮について、基本的な概念から実践的な設定方法まで、初心者にもわかりやすく徹底解説します。
実際に弊社LandingHubでも活用している高速化テクニックを惜しみなく公開しますので、ぜひ最後までご覧ください。
目次
gzip圧縮とは何か?
gzip圧縮とは、「GNU Zip」の略で、Webサーバーからブラウザへファイルを送信する際に、データをあらかじめ圧縮してから送信する技術です。ブラウザ側で自動的に解凍され、元のファイルとして処理されます。
なぜgzip圧縮が必要なのか?
現代のWebサイトでは、以下のような大容量ファイルが多く使われています:
- JavaScript(JSファイル): 平均100KB~500KB以上
- CSS: 平均50KB~200KB以上
- HTML: 動的に生成されるため、サイズが変動
- XML/JSON: API通信やデータ交換に使用
これらのファイルを圧縮することで、データ転送量を大幅に削減できます。例えば、jQuery 3.5.1ライブラリの場合、非圧縮版が287KBに対し、gzip圧縮版は87KBと約70%のサイズ削減が可能です。
gzip圧縮の仕組みと効果
圧縮アルゴリズムの詳細
gzip圧縮は、以下の2つのアルゴリズムを組み合わせて動作します:
- LZ77圧縮: 繰り返しパターンを見つけてデータを圧縮
- ハフマン符号化: 頻出する文字に短いビット列を割り当て
この二段階の圧縮により、特にテキストベースのファイルで高い圧縮率を実現できます。
圧縮効果の実例
実際の圧縮効果を見てみましょう:
CSSファイル
- Bootstrap 4.6.0: 154KB → 23KB(85%削減)
- Material Design Lite: 137KB → 20KB(85%削減)
JavaScriptファイル
- jQuery 3.5.1: 287KB → 87KB(70%削減)
- React 17.0.2: 42KB → 13KB(69%削減)
HTML
- 一般的なWebページ: 50KB → 15KB(70%削減)
このように、特にテキストベースのファイルでは70%~90%の圧縮率を実現できます。
Nginxでのgzip圧縮設定方法
基本的なgzip設定
まず、Nginxの設定ファイル(/etc/nginx/nginx.conf)を編集します:
Copyhttp {
# gzip圧縮を有効化
gzip on;
# 圧縮するファイルタイプを指定
gzip_types
text/plain
text/css
text/javascript
text/xml
application/javascript
application/x-javascript
application/json
application/xml
application/rss+xml
application/atom+xml
image/svg+xml;
# 圧縮レベルを設定(1-9, デフォルト: 6)
gzip_comp_level 6;
# 最小圧縮サイズを設定(1KB以下は圧縮しない)
gzip_min_length 1024;
# Varyヘッダーを追加
gzip_vary on;
# プロキシ経由でも圧縮を有効化
gzip_proxied any;
# 古いブラウザでは無効化
gzip_disable "msie6";
}
各設定項目の詳細解説
gzip_comp_level
- 1-9の範囲で指定(数値が大きいほど圧縮率が高い)
- 6が推奨(圧縮率とCPU使用率のバランスが良い)
- 9にすると圧縮率は向上するが、CPU負荷が大きく増加
gzip_min_length
- 指定したサイズより小さいファイルは圧縮しない
- 1024バイト(1KB)が推奨
- 小さなファイルは圧縮効果が少ない上、CPU負荷が発生
gzip_vary
Vary: Accept-Encoding
ヘッダーを追加- キャッシュサーバーが圧縮版と非圧縮版を正しく区別できる
gzip_proxied
- プロキシ経由のリクエストでも圧縮を有効化
any
を指定すると、すべてのプロキシリクエストで圧縮
実際の設定例
弊社LandingHubでは、以下のような設定を使用しています:
Copyhttp {
# gzip設定
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 1024;
gzip_buffers 16 8k;
gzip_http_version 1.1;
# 圧縮対象のMIMEタイプ
gzip_types
text/plain
text/css
text/javascript
text/xml
application/javascript
application/x-javascript
application/json
application/ld+json
application/xml
application/rss+xml
application/atom+xml
application/font-woff
application/font-woff2
application/x-font-ttf
font/opentype
image/svg+xml
image/x-icon;
# 古いブラウザでは無効化
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
}
gzip_staticを使った高度な最適化
gzip_staticとは?
gzip_static
は、事前に圧縮されたファイルを使用する機能です。通常のgzip圧縮は、リクエストの度にファイルを圧縮しますが、gzip_static
を使用すると、あらかじめ圧縮されたファイルを使用するため、CPU負荷を大幅に軽減できます。
動作の違い
通常のgzip圧縮
- クライアントからリクエスト
- サーバーがファイルを圧縮
- 圧縮されたファイルを送信
gzip_staticの場合
- クライアントからリクエスト
- サーバーが
.gz
ファイルを探す - 見つかった場合、事前圧縮ファイルを送信
- 見つからない場合、通常通り圧縮
gzip_staticの設定方法
Copy# gzip_staticを有効化
gzip_static on;
# 通常のgzip設定も併記
gzip on;
gzip_comp_level 1; # gzip_staticと併用時は低めに設定
gzip_min_length 1024;
gzip_vary on;
gzip_proxied any;
gzip_types text/plain text/css text/javascript application/javascript application/x-javascript application/json application/xml application/rss+xml image/svg+xml;
圧縮ファイルの作成方法
Linuxコマンドを使用
Copy# 最高圧縮レベル(9)で圧縮
gzip -9 -k style.css
# style.css.gzが作成される
# 複数ファイルを一括圧縮
find /path/to/files -name "*.css" -o -name "*.js" -o -name "*.html" | xargs gzip -9 -k
PHPを使用
Copy<?php
$content = file_get_contents('style.css');
$compressed = gzencode($content, 9);
file_put_contents('style.css.gz', $compressed);
?>
Node.jsを使用
Copyconst fs = require('fs');
const zlib = require('zlib');
fs.createReadStream('style.css')
.pipe(zlib.createGzip({ level: 9 }))
.pipe(fs.createWriteStream('style.css.gz'));
gzip_staticのメリット
- CPU負荷の軽減: 事前圧縮により、リアルタイム圧縮が不要
- 最高圧縮レベル: レベル9の圧縮を事前に適用可能
- 応答速度向上: 圧縮処理時間が不要
実際の効果測定と検証方法
設定確認コマンド
curlコマンドでの確認
Copycurl -I -H 'Accept-Encoding: gzip,deflate' https://example.com/
正常に動作していれば、以下のヘッダーが表示されます:
Content-Encoding: gzip
ブラウザでの確認方法
Chrome DevToolsでの確認
- F12でデベロッパーツールを開く
- Networkタブを選択
- ページを再読み込み
- ファイルを選択してResponse Headersを確認
「Use large request rows」を有効にすると、圧縮前後のファイルサイズを比較できます。
実際のパフォーマンス測定結果
弊社LandingHubでの測定結果をご紹介します:
PageSpeed Insights
- 対策前: モバイル73点、デスクトップ65点
- 対策後: モバイル85点、デスクトップ91点
読み込み時間
- 対策前: 4.02秒
- 対策後: 3.19秒(0.83秒短縮)
転送量
- 対策前: 5.3MB
- 対策後: 5.1MB(0.2MB削減)
効果測定ツール
1. Google PageSpeed Insights
- URL: https://developers.google.com/speed/pagespeed/insights/
- 「テキスト圧縮の有効化」の項目で効果を確認
2. GTmetrix
- URL: https://gtmetrix.com/
- 「Enable text compression」の項目で圧縮効果を確認
3. Pingdom Website Speed Test
- URL: https://tools.pingdom.com/
- 「Compress components with gzip」の項目で確認
4. WebPageTest
- URL: https://www.webpagetest.org/
- 「Compress Images」セクションで圧縮効果を確認
よくある問題とトラブルシューティング
gzip圧縮が効かない場合の原因と対処法
1. 設定ファイルの記述ミス
Copy# 間違い例
gzip_types text/css application/javascript; # セミコロンがない
# 正しい例
gzip_types text/css application/javascript;
2. MIMEタイプの不一致
Copy# /etc/nginx/mime.typesで確認
application/javascript js;
text/css css;
3. プロキシ設定の問題
Copy# CloudFrontなどのプロキシを使用する場合
gzip_proxied any;
gzip_staticが動作しない場合
1. モジュールの確認
Copynginx -V 2>&1 | grep -o with-http_gzip_static_module
2. ファイルパーミッションの確認
Copyls -la /path/to/file.css.gz
# 読み取り権限が必要
3. ファイルの存在確認
Copy# 元ファイルと同じディレクトリに.gzファイルが必要
ls -la /path/to/static/
style.css
style.css.gz
CPU負荷が高い場合の対処法
1. 圧縮レベルの調整
Copy# CPU負荷を抑える場合
gzip_comp_level 1; # デフォルト: 6
# 圧縮率を優先する場合
gzip_comp_level 9;
2. gzip_staticの活用
Copy# 事前圧縮ファイルを使用してCPU負荷を軽減
gzip_static on;
gzip_comp_level 1; # gzip_staticと併用時は低めに設定
3. 圧縮対象の最適化
Copy# 画像や動画など、既に圧縮されているファイルは除外
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/json
application/xml;
# image/jpeg, image/png, video/mp4 などは含めない
まとめ
Nginxでのgzip圧縮設定は、Webサイトの表示速度向上において最も効果的で実装しやすい手法の一つです。適切に設定することで、以下の効果を得ることができます:
期待できる効果
- ファイルサイズの大幅削減: 70%~90%の圧縮率
- 読み込み時間の短縮: 平均20%~30%の高速化
- 帯域幅の節約: サーバー負荷とコストの削減
- SEO効果: ページ速度向上によるランキング向上
設定時のポイント
- 基本設定から始める: まずは
gzip on
とgzip_types
から - 段階的な最適化: 効果を確認しながら設定を調整
- gzip_staticの活用: CPU負荷が気になる場合は事前圧縮を検討
- 定期的な検証: 設定変更後は必ず効果を測定
最後に
Webサイトの表示速度は、ユーザー体験に直結する重要な要素です。gzip圧縮は、設定ファイルにわずか数行を追加するだけで大きな効果を得られる、まさに「やらなきゃ損」な技術です。
弊社LandingHubでも、この技術を活用してお客様のランディングページの表示速度を向上させています。高速なランディングページは、コンバージョン率の向上に直結します。もし、より本格的なWebサイトの高速化をお考えでしたら、ぜひ一度ご相談ください。
皆さんも、この記事を参考にして、ぜひNginxでのgzip圧縮設定にチャレンジしてみてください。きっと、その効果に驚かれることでしょう。