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 キーワードの使用法の詳細な説明

推薦する

MySql データ型チュートリアル例の詳細な説明

目次1. 概要2. MySQLデータ型の詳細な説明1) 文字列型2) 整数型3) 浮動小数点型4) ...

WAMPにインストールするとMySQLが起動できるが、再起動後に起動できなくなる問題の解決方法

初めてwampをインストールした後、すべてのサービスが正常に使用できますが、再起動するとwampのア...

MySQLでホワイトリストアクセスを設定する方法

MySQLでホワイトリストアクセスを設定する手順1. ログイン mysql -uroot -pmys...

Mysql SQL ステートメント演習 (50 問)

テーブル名とフィールド–1. 学生リスト学生 (s_id、s_name、s_birth、s_sex)...

uniapp プロジェクトの最適化方法と提案

目次1. 複雑なページデータ領域をコンポーネントにカプセル化する2. 大きな画像の使用を避ける3. ...

Chrome Dev Tools を使用してページのパフォーマンスを分析する方法 (フロントエンドのパフォーマンス最適化)

背景開発やデバッグには Chrome Dev Tools がよく使用されますが、ページのパフォーマン...

MySQLとOracleの誤解の詳細な説明

目次本質的な違いデータベースセキュリティ権限スキーマの移行パターンオブジェクトの類似性スキーマオブジ...

Linux カーネル デバイス ドライバー proc ファイル システム ノート

/***************** * proc ファイルシステム***************...

安全な構成のためにDockerでTLSを有効にする手順

序文以前、Docker の 2375 Remote API を有効にしていました。会社のセキュリティ...

MySQLでSQL文がどのように実行されるかの詳細な説明

概要最近MySQL関連の知識を勉強し始めました。学んだ知識ポイントと自分の理解を元に整理して共有しま...

Tomcat Nativeを使用してTomcat IO効率を向上させる方法の詳細な説明

目次導入Tomcatへの接続方法APR と Tomcat ネイティブtomcat で APR を使用...

主キーを追加または変更するMySQL SQL文操作

テーブルフィールドを追加する テーブルtable1を変更し、トランザクタvarchar(10)をNu...

MySQL レプリケーション問題の 3 つのパラメータの分析

目次01 sql_slave_skip_counter パラメータ02 スレーブスキップエラーパラメ...

Linux nlコマンドの使い方

1. コマンドの紹介nl (行数) は指定されたファイルに行番号を追加し、標準出力に書き込みます。フ...