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. バックアップとリカバリの簡単な定義3. 復旧計画で考慮すべきいくつかの要素4...

...

Vueはキー表示のショートカットキー効果を取得する入力コンポーネントを実装します

ページ上でショートカットキーをカスタマイズする要件に遭遇し、ショートカットキーを設定して表示する場所...

gorm で MySql データベースを操作する方法

1. テーブル内のフィールドの大文字と小文字の区別を設定するgorm クエリを使用する場合、MySQ...

MySQLで最大接続数を達成する方法

目次データベース接続数が急増した理由は何ですか? 1. はじめに2. 知識ポイント3. 練習するIV...

Tomcat サーバーの設定と Web プロジェクトの公開に関する IDEA グラフィック チュートリアル

1. Webプロジェクトを作成したら、Tomcatを例にサーバーを構成する必要があります。 2. 実...

Dockerに関するよくある質問

Docker はポートを IPv6 にのみマッピングし、IPv4 にはマッピングしません。 dock...

Web デザイナーにはどのような知識体系が必要ですか?

製品設計者は、複雑で大規模な製造システムと多様な市場に直面しているため、知識体系には幅広さと深さの両...

CSS3を使用してボタンホバーフラッシュダイナミック特殊効果コードを実装する

CSS3 の列シリーズ属性を使用してウォーターフォールレイアウトを作成する方法を紹介しました。興味の...

MySQL パーティションテーブルの制限と制約の詳細な説明

ビルドを無効にするパーティション式では、次の構成はサポートされません。ストアドプロシージャ、ストアド...

ByteDance インタビュー: JS を使用して Ajax 同時リクエスト制御を実装する方法

序文正直に言うと、最近とても混乱していると感じています。テクノロジーと人生について。また、将来の発展...

MySQL 5.7.17無料インストール版のインストールと設定

MYSQLバージョン:MySQL Community Server 5.7.17、インストール不要版...

反応ルーティングでパラメータを渡すいくつかの方法についての簡単な説明

最初のパラメータ渡し方法は、動的ルーティングパラメータ渡しです。リンクのパス属性を設定することで、ル...

Docker で Tomcat、MySQL、Redis をインストールするための詳細な手順

目次DockerでTomcatをインストールするtomcatイメージを使用してコンテナを作成する(イ...

レスポンシブフレームワークのテーブルヘッダーの自動改行問題に対する簡単な解決策

最近、Bootstrap を使って Web サイトを開発しています。表を処理していたところ、PC で...