Nginx圧縮をマスターする:WebパフォーマンスのためのGzip vs. Brotli
Webパフォーマンスの最適化は、ユーザー維持率とSEOランキングにとって非常に重要です。レイテンシと帯域幅消費を削減する最も効果的な方法の1つは、Webアセットをクライアントに送信する前に圧縮することです。高性能WebサーバーであるNginxは、主に2つのモジュール、GzipとよりモダンなBrotliを通じて、コンテンツ圧縮のための堅牢なサポートを提供しています。
このガイドでは、これらの圧縮方法がNginx内でどのように機能するかを探り、その設定を詳述し、どちらのアルゴリズムがインフラストラクチャとパフォーマンス目標に最適かを判断するための直接的な比較を提供します。圧縮をマスターすることで、接続速度に関係なく、ユーザーのロード時間が短縮され、エクスペリエンスが向上します。
NginxでのWeb圧縮の理解
圧縮は、データ(HTML、CSS、JavaScriptファイルなど)内の繰り返しパターンを見つけて、それらをより短い参照に置き換えることによって機能します。これにより、ネットワーク経由で転送されるファイルの合計サイズが削減されます。Nginxは仲介者として機能し、選択された圧縮アルゴリズムを動的に適用してから、データをブラウザに送信します。
Nginxは通常、ngx_http_gzip_module(Gzip)またはngx_http_brotli_module(Brotli)がバイナリにコンパイルされている必要があります。ほとんどのモダンな、プリビルドされたNginxパッケージにはデフォルトでGzipサポートが含まれていますが、Brotliは明示的なインストールまたはコンパイルフラグが必要になることがよくあります。
前提条件
Brotliを使用する予定がある場合は、NginxのインストールがBrotliをサポートしていることを確認してください。Brotliが利用可能かどうかは、次のように実行して確認できます。
nginx -V 2>&1 | grep --color=always brotli
出力に--with-http_brotli_moduleと表示されれば、続行できます。
1. Gzip圧縮の設定
Gzipは、コンテンツ圧縮のための成熟した、広くサポートされている標準です。圧縮率とCPUオーバーヘッドの良好なバランスを提供します。
Nginx設定でのGzipの有効化
Gzip設定は、通常、Nginx設定ファイル(nginx.confまたは含まれる設定ファイル)のhttp、server、またはlocationブロック内に配置されます。
Gzip圧縮を有効にするには、次のディレクティブを使用します。
http {
# Gzip圧縮を有効にする
gzip on;
# 圧縮する最小応答サイズ(バイト)を設定する
# 1000バイトより大きいファイルのみを圧縮する
gzip_min_length 1000;
# 圧縮レベル(1=最速/最低圧縮、9=最遅/最高圧縮)
gzip_comp_level 6;
# 圧縮するMIMEタイプを指定する
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
# 推奨:プロキシが圧縮版と非圧縮版の両方をキャッシュできるように、Vary: Accept-Encodingヘッダーを送信する
gzip_vary on;
# 推奨:識別用のgzipヘッダーを追加する
gzip_proxied any;
}
主要なGzipディレクティブの説明:
gzip on;: Gzipモジュールをアクティブにします。gzip_comp_level: 4から6の間の設定は、パフォーマンスのスイートスポットであることがよくあります。レベルが高いほど帯域幅は節約されますが、サーバーのCPU使用率は増加します。gzip_types: 重要なのは、画像(.jpg、.png、.gif)やビデオなどの既に圧縮された形式を決して圧縮しないことです。
2. Brotli圧縮の設定
BrotliはGoogleによって開発された新しい圧縮アルゴリズムです。一般的に、Gzipよりも大幅に優れた圧縮率(多くの場合15〜25%小さいファイル)を、同等またはわずかに高いCPUコストで達成します。特に、プリコンプレストファイルやキャッシュの場合です。
Nginx設定でのBrotliの有効化
Brotliの設定は同様のディレクティブを使用しますが、gzipをbrotliに置き換えます。
brotli on;
brotli_comp_level 6; # 通常4から8が推奨される
brotli_static on; # 利用可能な場合、プリコンプレストされた.brファイルを配信できるようにする
brotli_types text/plain text/css application/json application/javascript application/x-javascript text/xml;
プリコンプレッションに関する重要事項(brotli_static):
Brotli圧縮は、すべてのリクエストに対してオンザフライで実行される場合、CPU負荷が高くなる可能性があります。一般的なベストプラクティスは、専用のオフラインツール(brotliコマンドラインユーティリティなど)を使用してアセットをプリコンプレストし、元のファイル(例:style.cssおよびstyle.css.br)とともに.brバージョンを保存することです。
brotli_static on;を設定すると、Nginxは要求されたリソースに対してプリコンプレストされた.brファイルが存在するかどうかを確認し、クライアントがBrotliをサポートしている場合は直接配信します。これにより、リアルタイム処理が完全にバイパスされます。
3. Gzip vs. Brotli:適切な選択をする
GzipとBrotliの選択は、クライアントのサポートとサーバーリソースに大きく依存します。
| 特徴 | Gzip | Brotli | 推奨 |
|---|---|---|---|
| 圧縮率 | 良好 | 優秀(15〜25%向上) | Brotliが優位 |
| CPU負荷(オンザフライ) | 低 | 中〜高 | Gzipが軽量 |
| クライアントサポート | ほぼ普遍的(すべてのモダンブラウザ) | 非常に高い(ほとんどのモダンブラウザ) | レガシサポートにはGzipが安全 |
| プリコンプレッション | 可能だが、あまり一般的ではない | 強く推奨(brotli_static) |
可能であればBrotliプリコンプレストを使用 |
ハイブリッドアプローチ:ベストプラクティス
最も堅牢なモダンな設定は、ハイブリッドセットアップを使用し、モダンなクライアントにはBrotliを優先し、BrotliをサポートしないクライアントにはGzipを信頼できるフォールバックとして提供します。
- Brotliを優先する:
brotli_static on;を速度のために使用するなど、Brotliを最初に設定します。 - Gzipにフォールバックする: Gzipが有効になっており、Brotliをサポートしないクライアントを処理するように設定されていることを確認します。
Nginxは、クライアントによって送信されるAccept-Encodingヘッダーに基づいて、利用可能な最良のオプションを自動的に配信します。
ハイブリッド設定例
Nginxのバージョンが両方のモジュールをサポートしている場合、同時に両方を有効にできます。Nginxは、クライアントのリクエストヘッダーに基づいて、どのモジュールがコンテンツを配信するかを優先します。
http {
# --- Brotli設定(優先度高/圧縮率高) ---
brotli on;
brotli_comp_level 6;
brotli_static on; # Brotliでのパフォーマンスのために重要
brotli_types text/plain application/javascript application/json;
# --- Gzip設定(フォールバック) ---
gzip on;
gzip_comp_level 5;
gzip_vary on;
gzip_proxied any;
gzip_types text/css application/xml;
# 注:予期しない動作を避けるために、MIMEタイプリストが完全に重複しないようにしてください。
# ただし、Nginxは通常これをインテリジェントに処理します。
}
パフォーマンスチューニングのヒント
選択したアルゴリズムに関係なく、最大限の効果を得るためにこれらのベストプラクティスに従ってください。
1. クライアントサポートの確認
Vary: Accept-Encodingヘッダーを使用して、クライアントが圧縮を要求したことを常に確認してください。このヘッダーがない場合、プロキシが誤ってファイルの誤ったバージョンをキャッシュする可能性があります。gzip_vary on;はGzipに対してこれを処理します。
2. 過剰な圧縮を避ける
サーバーの利用率が著しく低い場合を除き、gzip_comp_levelまたはbrotli_comp_levelを(例:9または11)高すぎる値に設定しないでください。ファイルサイズ削減のわずかな増加は、計算に必要な追加のCPUサイクルを正当化することはめったにありません。
3. プリコンプレストファイルのキャッシュ
Brotliの場合、brotli_static on;を使用し、静的アセットをプリコンプレストすることが、パフォーマンスの最大の向上につながります。これにより、CPU負荷がリクエスト時間からデプロイ時間にシフトします。
4. 設定のテスト
Nginx設定を変更した後、リロードする前に常に構文をテストしてください。
sudo nginx -t
成功したら、Nginxをリロードして変更を適用します。
sudo systemctl reload nginx
オンラインツール(GTmetrixやWebPageTestなど)を使用して、レスポンスが実際にContent-Encoding: gzipまたはContent-Encoding: brヘッダーで配信されていることを確認してください。
結論
Nginxは、Web全体で転送されるデータのサイズを削減するための洗練されたツールを提供します。Gzipは普遍的に安全な選択肢として残っていますが、Brotliは優れた圧縮効率を提供し、特にbrotli_staticをプリコンプレストアセットで活用する場合、推奨されるモダンな標準となっています。ハイブリッドアプローチを実装し、圧縮レベルを適切に調整することで、アプリケーションの応答時間を大幅に改善し、世界クラスのパフォーマンスエクスペリエンスを提供できます。