Brotli圧縮アルゴリズムを有効にするNginxの実装プロセスの詳細な説明

Brotli圧縮アルゴリズムを有効にするNginxの実装プロセスの詳細な説明

序文

Web アプリケーションでは、トラフィックを節約し、転送データのサイズを縮小し、転送効率を向上させるために、一般的に gzip という圧縮方法が広く使用されています。今日は、より効率的な別の圧縮方法である brotli を紹介します。

Brotli は、LZ77 アルゴリズム、ハフマン コーディング、および 2 次コンテキスト モデリングの最新版に基づいています。 Google のソフトウェア エンジニアは、2015 年 9 月に、特に HTTP 圧縮に重点を置いた一般的なロスレス データ圧縮を含む Brotli の拡張バージョンをリリースしました。

注: このアルゴリズムを使用する前提は、https を有効にすることです。http リクエストのリクエスト ヘッダーの Accept-Encoding: gzip, deflate には br が含まれていないためです。
Brotli アルゴリズムの詳細については、https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Brotli を参照してください。

Brotli プロトコルのブラウザサポート

さまざまなレベルのさまざまな圧縮アルゴリズムの比較

図から、brotli 圧縮アルゴリズムと gzip 圧縮アルゴリズムは、一般的に全体的なパフォーマンス、特に解凍速度が優れていることがわかります。 brotli アルゴリズムまたは gzip を選択する場合は、実際のシナリオに応じて調整する必要があります。

Brotliをダウンロード

google/ngx_brotli 2016 年 12 月のバージョン以降、google/brotli が組み込まれているため、bagder/libbrotli ライブラリを個別にコンパイルする必要がなく、インストールが簡単になります。 google/ngx_brotliをダウンロードして/usr/src/ngx_brotliディレクトリに解凍します。

/usr/src に移動します

git クローン https://github.com/google/ngx_brotli.git

次に、google/brotli をダウンロードし、/usr/src/ngx_brotli/deps/brotli に解凍します。

cd /usr/src/ngx_brotli/deps && rm -rf brotli
git クローン [email protected]:google/brotli.git
cd /usr/src/ngx_brotli && git サブモジュール更新 --init

Brotli のコンパイル

Nginx はバージョン 1.9.11 以降で動的モジュールをサポートしています。それ以降は、nginx にモジュールを追加するために nginx を再コンパイルする必要がなくなりました。動的モジュールを使用すると、実行時にサードパーティ製モジュールまたは Nginx 公式モジュールを選択的に読み込むことができます。新しい実装は、API モジュールを介して可能な限り下位互換性を維持します。

nginxインストールパッケージをダウンロードして解凍します

現在の nginx バージョンと同じ nginx インストール パッケージをダウンロードしてください。 nginx の公式ダウンロード アドレスは http://nginx.org/en/download.html です。 ここでは、現在のサーバー nginx がバージョン 1.14.2 であると想定しています。

現在のnginxのバージョンは次のコマンドで取得できます。

nginx -v

出力

nginx バージョン: nginx/1.14.2

nginxインストールパッケージをダウンロードする

/usr/src に移動します
http://59.80.44.46/nginx.org/download/nginx-1.14.2.tar.gz をダウンロードしてください

インストールパッケージを解凍する

tar -xvf nginx-1.14.2.tar.gz

動的モジュールのコンパイル

まず、解凍した nginx インストール パッケージのディレクトリに入り、configure を実行してから、make modules を使用します。

nginx-1.14.2をインストールします
./configure --with-compat --add-dynamic-module=/usr/src/ngx_brotli
モジュールを作る

パラメータ構文: --add-dynamic-module=[モジュールのソースコードが配置されているディレクトリへの絶対パス]

実行が完了したら、コンパイルされたモジュールを確認します。

ls objs/*.so

出力:

objs/ngx_http_brotli_filter_module.so objs/ngx_http_brotli_static_module.so

コンパイルされたモジュールファイルをnginxの動的モジュール読み込みディレクトリにコピーします。

cp objs/{ngx_http_brotli_filter_module.so、ngx_http_brotli_static_module.so} /etc/nginx/modules

Brotli モジュールの登録

nginx 動的モジュールの管理を容易にするために、動的モジュールを個別に管理するための modules.conf ファイルを作成することをお勧めします。

/etc/nginx/modules.conf を修正する

/etc/nginx/nginx.conf 構成ファイルに modules.conf ファイルを導入し、次の内容を見つけて変更します。

pid /var/run/nginx.pid;

/etc/nginx/modules.conf を含めます。

/etc/nginx/modules.conf を開き、コンパイルした Brotli モジュールを登録します。

Brotli モジュール
モジュールモジュール/ngx_http_brotli_filter_module.so をロードします。
モジュールモジュール/ngx_http_brotli_static_module.so をロードします。

Brotli 圧縮を有効にする

Brotli と gzip は共存できるため、gzip を無効にする必要はありません。

/etc/nginx/nginx.conf で Brotli を有効にします。

http {
  ...
  # 圧縮
  gzip オン;
  gzip_min_length 1k;
  gzip_バッファ 4 32k;
  gzip_http_バージョン1.1;
  gzip_comp_レベル5;
  gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
  gzip_vary オン;
  gzip_proxied 任意;
  gzip_disable "MSIE [1-6]\.";

  #ブロトリ
  ブロトリオン;
  brotli_comp_レベル 6;
  brotli_buffers 16 8k;
  ブロトリの最小長さ 20;
  brotli_types テキスト/プレーン テキスト/css アプリケーション/json アプリケーション/x-javascript テキスト/xml アプリケーション/xml アプリケーション/xml+rss テキスト/javascript アプリケーション/javascript image/svg+xml;
  ...
}

gzip と brotli の設定の詳細

Gzip チューニング gzip 圧縮機能を使用すると、帯域幅を節約し、転送を高速化し、より良いエクスペリエンスを提供し、コストを節約できるため、これが重要なポイントです。 gzip の詳細な紹介については、ここをクリックしてください。

gzip on は gzip 圧縮をオンにします。

gzip_最小長さ 1k

圧縮されたページに許可される最小バイト数を設定します。ページのバイト数は、Content-Length ヘッダーから取得されます。デフォルト値は 0 です。ページがどれだけ大きくても、圧縮されます。1K より大きい値に設定することをお勧めします。1K 未満の場合、圧縮されるにつれてページ サイズが大きくなる可能性があります。

gzip_バッファ

圧縮バッファサイズは、圧縮結果ストリームキャッシュとして 32KB のメモリを 4 ユニット適用することを示します。デフォルト値は、gzip 圧縮結果を格納するために元のデータ サイズと同じメモリ領域を適用します。

gzip_http_バージョン 1.1

圧縮バージョンは、HTTP プロトコル バージョンの設定に使用されます。デフォルトは 1.1 です。現在、ほとんどのブラウザは既に GZIP 解凍をサポートしているため、デフォルトを使用できます。

gzip_comp_レベル 5

圧縮率は、gzip 圧縮率を指定するために使用されます。1 は圧縮率が最小で処理速度が最も速いことを意味し、9 は圧縮率が最大で転送速度が速いことを意味しますが、処理速度が遅くなり、CPU 消費量が多くなります。推奨設定は5です。

gzip_types

圧縮のタイプを指定するために使用されます。text/html タイプは常に圧縮されます。

gzip_vary オン

これは http ヘッダーに関係します。プロキシ サーバー用に vary ヘッダーが追加されます。ブラウザーによっては圧縮をサポートしているものとサポートしていないものがあります。データの無駄を避けるために、サポートしていないブラウザーでは圧縮が行われます。したがって、圧縮が必要かどうかはクライアントの HTTP ヘッダーに基づいて判断されます。

gzip_proxied 任意

nginx をリバース プロキシとして使用する場合に有効にすると、バックエンド サーバーによって返される結果をオンまたはオフにできます。一致の前提条件は、バックエンド サーバーが Via を含むヘッダーを返す必要があることです。デフォルトはオフです。 オプションのパラメータ値:

  • オフ すべてのプロキシ結果データの圧縮をオフにします
  • 期限切れ ヘッダーにExpiresヘッダー情報が含まれている場合は圧縮を有効にする
  • no-cacheは、ヘッダーにCache-Control: no-cacheヘッダー情報が含まれている場合に圧縮を有効にします。
  • no-storeは、ヘッダーにCache-Control: no-storeヘッダー情報が含まれている場合に圧縮を有効にします。
  • privateは、ヘッダーにCache-Control:privateヘッダー情報が含まれている場合に圧縮を有効にします。
  • no_last_modifiedは、ヘッダーにLast-Modifiedヘッダー情報が含まれていない場合に圧縮を有効にします。
  • no_etagは、ヘッダーにETagヘッダー情報が含まれていない場合に圧縮を有効にします。
  • authは、ヘッダーにAuthorizationヘッダー情報が含まれている場合に圧縮を有効にします。
  • any は無条件に圧縮を有効にします

gzip_disable

IE6 の gzip 圧縮を無効にします。 IE6 の gzip 圧縮のサポートは非​​常に貧弱で、ページがフリーズする可能性があります。 IE6 の問題を回避するには、このパラメータを追加することをお勧めします。

ブロトリチューニング

Google は、インターネット ユーザーの時間は貴重であり、長い Web ページの読み込み時間で無駄にされるべきではないと考えており、2015 年 9 月にロスレス圧縮アルゴリズム Brotli を導入しました。 Brotli は、LZ77 アルゴリズムのバリエーション、ハフマン コーディング、および 2 次テキスト モデリングを通じてデータを圧縮します。他の圧縮アルゴリズムと比較して、圧縮効率が高くなります。 brotli の詳細については、ここをクリックしてください。

注: brotli モジュールがインストールされていない場合は、構成項目のこの部分を構成する必要はないため、スキップできます。

Brotli オン

brotli 圧縮を有効にします。

ブロトリ_コンプ_レベル6

圧縮率。brotli 圧縮率を指定するために使用されます。1 は圧縮率が最小で、処理速度が最も速く、11 は圧縮率が最大で、転送速度は速くなりますが、処理が遅く、CPU リソースをより多く消費します。デフォルト値は 6 ですので、デフォルト値を使用することができます。

ブロトリバッファ 16 8k

応答を圧縮するために使用されるバッファの数とサイズを設定します。デフォルトでは、バッファ サイズは 1 つのメモリ ページと同じです。 デフォルト値: 32 4k|16 8k。

ブロトリの最小長さ 20

圧縮する応答の最小の長さを設定します。長さは、Content-Length 応答ヘッダー フィールドによってのみ決定されます。デフォルトは 20 です。

ブロトリタイプ

圧縮のタイプを指定するために使用されます。text/html タイプは常に圧縮されます。

gzip と brotli の構成詳細は、リバース プロキシ構成ファイル コードに追加されます。

proxy_set_header Accept-Encoding "";

例:

サーバー{
  ...
  位置 / {
    ...
    proxy_set_header Accept-Encoding "";
    ...
  }
  ...
}

設定を有効にするにはnginxを再起動します

systemctl nginx を再起動します

http リクエストの Accept-Encoding: gzip, deflate リクエスト ヘッダーに br がないため、Brotli 圧縮は https でのみ有効になります。
一時ファイルのクリーンアップ

各コンパイル後に、アプリケーション パッケージから抽出されたファイルまたはディレクトリを削除する習慣を身に付ける必要があります。

rm -rf /usr/src/{nginx-1.14.2/,ngx_brotli/} を実行します。

最後に動作するか確認する

Web ページを開き、Chrome デベロッパー ツールを使用してデバッグします。ネットワーク列に content-encoding:br が表示され、ネットワーク時間の消費が大幅に削減されます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Nginx で Brotli 圧縮アルゴリズムを有効にする方法の例
  • Nginx で Brotli アルゴリズム圧縮を有効にする例
  • NginxはGzipアルゴリズムを使用してメッセージを圧縮します
  • Nginxポーリングアルゴリズムの基本的な実装方法の詳細な説明
  • Nginx 7層負荷分散のいくつかのスケジューリングアルゴリズムの簡単な理解
  • Nginx の負荷分散アルゴリズムとフェイルオーバー分析
  • C# は Nginx のスムーズな重み付けポーリング アルゴリズムを実装します
  • nginxの4つのスケジューリングアルゴリズムと高度な機能の詳細な分析

<<:  Vue3 で状態管理を実装するために provide を使用する方法

>>:  MySQL における ESCAPE キーワードの使用法の詳細な説明

推薦する

Vueルータールーティングの詳細な説明

目次1. 基本的な使い方2. 注意すべき点3. マルチレベルルーティング(マルチレベルルーティング)...

誤って削除されたデータを復元するための mysqlbinlog コマンドを使用した mysql の実装

実験環境: MYSQL 5.7.22バイナリログを有効にするログ形式 MIXED実験プロセス: 1....

MySQL データベースの操作とデータ型

目次1. データベース操作1.1 データベースの表示1.2 データベースを作成する1.3 データベー...

Nexus をベースに Alibaba Cloud プロキシ ウェアハウスを構成するプロセスの分析

Nexus のデフォルトのリモートリポジトリは https://repo1.maven.org/ma...

Linux で推奨される 9 つの優れたコード比較ツールの概要

コードを書くとき、2 つのファイル間の違い、または同じファイルの異なるバージョン間の違いを知る必要が...

Linux でディスクをマウントし、起動時に自動的にマウントするように設定する方法

皆さんの時間は貴重だと承知しているので、プロセス コマンドを直接書き留めておきます。設定できます。原...

Windows システムに mysql5.7.21 をインストールするための詳細なチュートリアル

MySQL インストーラーは、MySQL ソフトウェアのあらゆるニーズに対応する、使いやすいウィザー...

ネイティブJavaScriptでカルーセルを実装する

この記事では、JavaScriptでカルーセルを実装するための具体的なコードを参考までに紹介します。...

CentOS での samba フォルダ共有サーバー構成の詳細な説明

1. はじめに最近、CentOS での開発には多くの不便があることがわかりました。Windows/M...

Mysqlチュートリアルでのグループランキングの実装例の詳細な説明

目次1. データソース2. データの総合順位1) 総合ランキング2) 同順位3) 同順位3. データ...

SQL 最適化チュートリアル: IN クエリと RANGE クエリ

序文「High Performance MySQL」では、インデックスでは範囲フィールドの後の部分が...

ページのキャッシュを防ぐソリューション

解決: <head> に次のコードを追加します。コードをコピーコードは次のとおりです。 ...

CSS3 アニメーション ボールローリング JS コントロールアニメーション一時停止

CSS3 はアニメーションを作成でき、多くの Web ページのアニメーション画像、Flash アニメ...

インタラクティブな視覚化 JS ライブラリ gojs の使い方の紹介とヒント

目次1. gojsの紹介2. Gojsのアプリケーションシナリオ3. gojs を選ぶ理由: 4. ...

MySQLに絵文字表現を保存する詳細な手順

原因: java.sql.SQLException: 列の文字列値が正しくありません: '\...