NginxはGzipアルゴリズムを使用してメッセージを圧縮します

NginxはGzipアルゴリズムを使用してメッセージを圧縮します

HTTP圧縮とは

場合によっては、比較的大きなメッセージ データがクライアントとサーバー間で送信され、大量のネットワーク帯域幅と時間が消費されることがあります。帯域幅を節約し、メッセージの応答速度を高速化するために、送信するメッセージ データを送信前に圧縮することができます。

HTTP は複数のメッセージ圧縮アルゴリズムをサポートしています。以下は一般的なリクエスト ヘッダーです。Accept-Encoding フィールドから、gzip、deflate、br の圧縮アルゴリズムをサポートしていることがわかります。この記事では、Gzip アルゴリズムを使用してメッセージを圧縮することに焦点を当てます。たとえば、Gzip を使用して HTML、Javascript、CSS ファイルを圧縮します。圧縮すると、ネットワーク経由で送信されるデータの量が大幅に削減され、ユーザーが Web ページを表示する速度が向上します。

受け入れる: text/html、application/xhtml+xml、application/xml;q=0.9、image/webp、image/apng、*/*;q=0.8
受け入れエンコーディング: gzip、deflate、br
受け入れ言語: zh-CN,zh;q=0.9
キャッシュ制御: max-age=0
接続: キープアライブ
ホスト: localhost:8000
変更日時: 2020 年 4 月 21 日火曜日 14:09:01 GMT
一致しない場合: "5e9efe7d-264"
安全でないアップグレード要求: 1
ユーザーエージェント: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/71.0.3578.98 Safari/537.36

どのようなテクノロジーにも 2 つの側面があります。HTTP 圧縮は帯域幅の使用量を削減し、応答速度を高速化できますが、追加の圧縮および解凍プロセスが必要になるため、クライアントまたはサーバーのコンピューティング リソースをある程度占有します。

HTTP に精通している読者は、HTTP メッセージ本文をエンコードおよび暗号化できることをご存知でしょう。実は、HTTP 圧縮は特殊なエンコード方式です。このエンコード方式を使用すると、メッセージのサイズを大幅に削減でき、対応する解決方法を使用すると元のメッセージを復元できます。 (圧縮技術の本質は実は一種のエンコード方式であることがわかります)

HTTP 圧縮の使用シナリオ

上記の HTTP 圧縮の紹介から、このテクノロジは最適化テクノロジであり、帯域幅を節約して応答を高速化するために、サーバーから返されるメッセージを圧縮するためによく使用されることがわかります。

以下は、HTTP で Gzip 圧縮を使用するプロセスの簡単な紹介です。

  • ブラウザは Web サーバーに HTTP 要求を送信します。要求には Accept-Encoding: gzip、deflate、br が含まれます。 (ブラウザが gzip 圧縮をサポートしていることをサーバーに伝えます)
  • リクエストを受信すると、Web サーバーはまず元の Content-Type と Content-Length を含む元のレスポンスを生成します。
  • Web サーバーはレスポンスを Gzip でエンコードします。エンコード後、ヘッダーには Content-Type と Content-Length (圧縮サイズ) が含まれ、Content-Encoding: gzip が追加されます。その後、レスポンスがブラウザーに送信されます。
  • ブラウザはレスポンスを受信すると、Content-Encoding:gzip に従ってレスポンスをデコードします。 元の応答を取得した後、Web ページが表示されます。

クライアントは圧縮されたデータをサーバーに送信し、コードを通じて要求データを解凍することもできます。標準化のために、Content-Encoding:gzip も要求に追加する必要があります。

Nginx による HTTP 圧縮の実装

Nginx は HTTP Gzip 圧縮をサポートしています。ここでは、Nginx を調整して返信メッセージを圧縮する方法を説明します。

Nginx は、ngx_http_gzip_module モジュール、ngx_http_gzip_static_module モジュール、および ngx_http_gunzip_module モジュールを通じて Gzip 機能をサポートしています。通常、Nginx はデフォルトでこれらのモジュールをコンパイルします。インストールした nginx にこれらのモジュールが含まれているかどうかを確認するには、nginx -V コマンドを使用します。

Gzip 関連の指示は、構成ファイルの http ブロック、サーバー ブロック、またはロケーション ブロックに記述できます。

ngx_http_gzip_module モジュール

ngx_http_gzip_module モジュールは、主に Gzip 関数の有効化と設定、および応答データに対するオンラインのリアルタイム圧縮の実行を担当します。このモジュールには、次の主なディレクティブが含まれています。

# Gzip 機能を有効または無効にします。デフォルトでは、このコマンドはオフに設定されており、Gzip 機能は有効になっていません。このディレクティブがオンに設定されている場合にのみ、他のディレクティブ設定が有効になります gzip on | off

# Gzip 圧縮ファイルで使用されるキャッシュ領域のサイズを設定します。# デフォルト値: gzip_buffers 32 4k|16 8k
gzip_buffers 数値サイズ;

# このコマンドは、レベル 1 からレベル 9 までの Gzip 圧縮レベルを設定するために使用されます。
# レベル 1 は、圧縮レベルが最も低く、圧縮効率が最も高いことを意味し、レベル 9 は、圧縮レベルが最も高く、圧縮効率が最も低く、消費時間が最も長いことを意味します。
# デフォルトは1
gzip_comp_level レベル

# 異なるタイプのクライアントによって開始されたリクエストに対して、Gzip 機能を選択的に有効または無効にすることができます。
# 正規表現をサポートします。正規表現はクライアントのブラウザ フラグ (User-Agent、UA) に基づいて設定されます。
gzip_disable 正規表現 ...;

# この設定では、UC 文字列に MSIE 4、MSIE 5、および MSIE6 を含むすべてのブラウザーに一致する正規表現を使用します。
# これらのブラウザからのリクエストに応答する場合、Nginx サーバーは Gzip 圧縮を実行しません。
gzip_disable MSIE [4-6]\.;

# 初期のブラウザや HTTP クライアントの中には Gzip 自己解凍をサポートしていないものがあり、文字化けした文字が表示されることがあります。そのため、HTTP プロトコルのバージョンごとに、Gzip 機能を有効化または無効化する必要があります。このディレクティブは、Gzip 機能を有効にするための最小 HTTP プロトコル バージョンを設定するために使用されます。
# デフォルト設定はバージョン 1.1 です。つまり、クライアントが HTTP プロトコル バージョン 1.1 以上を使用する場合にのみ、Gzip 関数を使用して応答出力データを圧縮します。
# 現在、ほとんどのブラウザは Gzip 自己解凍をサポートしているため、デフォルト値で十分です。
zip_http_バージョン 1.0 | 1.1;

# このディレクティブはページのバイト数を設定します。Gzip 機能は、応答ページのサイズがこの値より大きい場合にのみ有効になります。
# gzip_min_length を 1024 に設定することをお勧めします。
gzip_min_length 長さ;

# Nginx サーバーがバックエンド サーバーから返された結果に対して Gzip 圧縮を実行するかどうかを設定するために使用されます。
# 一般的に、バックエンドは restAPI インターフェースとして使用され、返されるデータの量はそれほど大きくないため、圧縮は推奨されません。 # バックエンドから返されるデータを本当に圧縮する必要がある場合は、このセクションの内容を確認できます gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;

# MIME タイプを設定します。設定されたタイプは圧縮されます。デフォルト値は text/html です。
# この変数は「*」に設定することもできます。これは、すべての MIME タイプのページ データを Gzip 圧縮することを意味します。# 通常は、次のように設定できます: gzip_types text/plain application/javascript text/css text/xml
gzip_types MIME タイプ ...;

# これをオンにすると、レスポンスヘッダーに Accept-Encoding: gzip が追加されます
gzip_vary オン | オフ;

ngx_http_gzip_static_module モジュール

ngx_http_gzip_static_module モジュールは、主に Gzip 関数によって事前に圧縮されたデータの検索と送信を担当します。これらのデータは、拡張子「.gz」でサーバー上に保存されます。クライアントが要求したデータが以前に圧縮されており、クライアント ブラウザーが Gzip 圧縮をサポートしている場合は、圧縮されたデータが直接返されます。

このモジュールと ngx_http_gzip_module モジュールの主な違いは、このモジュールが静的圧縮を使用し、HTTP 応答ヘッダーにメッセージ本文の長さを示す Content-Length ヘッダー フィールドを含めることです。これは、サーバーが応答データの長さを判断できる場合に使用されます。一方、後者はデフォルトでチャンク エンコードされた動的圧縮を使用します。これは主に、大きなファイルのダウンロードなど、サーバーが応答データの長さを判断できず、データ長をリアルタイムで生成する必要がある状況に適しています。

このモジュールの命令の使用方法は、ngx_http_gzip_static_module モジュールの使用方法と似ているため、ここでは詳細には説明しません。公式ドキュメントを参照してください

このモジュールは、Nginx サーバーのオプションの HTTP モジュールです。これを使用する場合は、Nginx プログラムを構成するときに --with-http_gzip_static_module ディレクティブを追加する必要があります。

ngx_http_gunzip_module モジュール

Nginx サーバーは、応答出力データ ストリームの Gzip 圧縮をサポートしています。クライアント ブラウザーでは、Gzip 圧縮されたデータを解凍して処理できる必要があります。ただし、クライアント自体がこの機能をサポートしていない場合、Nginx サーバーはデータを送信する前に解凍する必要があります。これらの圧縮データは、バックエンド サーバーの圧縮または Nginx サーバーの事前圧縮から取得される場合があります。 ngx_http_gunzip_module モジュールは、Gzip 圧縮データの処理をサポートしていないクライアント ブラウザーの圧縮データを解凍するために使用されます。

同様に、このモジュールの使用方法についても詳しく説明しません。公式ドキュメントを参照してください。

最近のブラウザは一般的に圧縮をサポートしているため、このモジュールが使用される可能性は低くなります。

設定例

gzip オン;
gzip_min_length 1000;
gzip_proxied 期限切れ、キャッシュなし、保存なし、プライベート認証。
gzip_types テキスト/プレーン アプリケーション/xml;

Nginx サーバーが Gzip 圧縮機能をグローバルに適用できるようにするには、Gzip 構成を http グローバル ブロックに配置します。各仮想ホストを別々に扱いたい場合は、
ブロック内にそれぞれの Gzip 構成ディレクティブを追加します。

続きを読む

日常生活で開発されるすべてのアプリケーションが Nginx を使用するわけではありません。他の Web サーバーで HTTP 圧縮のサポートを有効にする方法を見てみましょう。

1. Spring Bootに組み込まれたTomcatの圧縮を有効にする

Tomcat は、サーバー コンテナ + http サーバーとして、gzip 圧縮もサポートします。従来の Tomcat を使用する場合は、server.xml 構成で HTTP 圧縮を有効にするだけで済みます。
埋め込みバージョンでは、コードを通じて設定する必要があります。 spring-boot の組み込み tomcat は埋め込みバージョンです。一部のデフォルトの tomcat 構成は組み込みの自動構成メカニズムを通じて行われていますが、spring-boot は一部の一般的でない/高度な構成のエントリを提供していません。

ただし、Spring Bean の特性により、Tomcat 関連の構成を含む、デフォルトでアセンブルされた Bean をオーバーライドできます。圧縮構成を有効にするには、TomcatConnectorCustomizer インターフェースを使用します。

パブリッククラスConnC1はTomcatConnectorCustomizerを実装します{

 @オーバーライド
 パブリック void カスタマイズ(コネクタ コネクタ) {
  プロトコル ハンドラー protocolHandler = connector.getProtocolHandler();
  if (protocolHandler インスタンス Http11NioProtocol) {
   Http11NioProtocol http11NioProtocol = (Http11NioProtocol) プロトコル ハンドラー;
   http11NioProtocol.setCompression("on");//デフォルトはオフ
   圧縮可能なMimeTypeを設定します。
   http11NioProtocol.setCompressionMinSize(2048);//デフォルト 2048(B)
   http11NioProtocol.setMaxKeepAliveRequests(1);//デフォルト 200
  }
 }
}

Tomcat の HTTP 圧縮のサポートに関しては、Tomcat の CompressionConfig クラスから手がかりを探し始めることができます。

実際、圧縮のサポートを単純に有効にしたい場合は、Spring Boot で次の構成を行うだけです。

サーバ:
 圧縮:
 有効: true
 最小応答サイズ: 1024
 MIMEタイプ:
  アプリケーション/json

要約する

Nginx の Gzip 機能に関するこの記事はこれで終わりです。Nginx の Gzip 機能についてさらに詳しく知りたい方は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Nginx Gzipモジュールの有効化と設定手順の詳細な説明
  • サーバー側(Apache、IIS、Nginx)でGZIP圧縮機能を有効にする方法
  • nginxでgzip圧縮を有効にする手順を完了する
  • Nginx gzip設定について
  • Nginx gzip コマンドの使用の概要

<<:  openlayers6のマップオーバーレイの詳細な説明

>>:  mysqlは内部コマンドエラーの解決策ではありません

推薦する

無料のパブリック STUN サーバー

無料のパブリック STUN サーバーSIP 端末がプライベート IP アドレスを使用する場合、スタン...

vue3 コンポーネント通信方法の概要と例

vue3コンポーネントの通信モードは次のとおりです。小道具$放出$expose / 参照$属性vモデ...

MySql ストアド プロシージャ パラメータの初歩的な使用法の詳細な説明

パラメータでのストアドプロシージャの使用IN パラメータは、プロシージャに情報を渡すためにのみ使用さ...

一般的な Nginx のテクニックと例の概要

1. 複数サーバーの優先順位たとえば、各サーバー ブロックがポート 80 をリッスンする場合、www...

CentOS7 で Jenkins+Maven+Git 継続的インテグレーション環境を構築する方法

この記事では、Spring boot + Maven プロジェクトのデプロイメントを例に、Code ...

Docker ベースの Redis マスタースレーブ クラスタの実装

目次1. Redisイメージを取得する2. 6つのRedisコンテナを作成する3. Redisコンテ...

CSS グリッドレイアウトで列にアイテムを埋め込む方法

n 個のアイテムがあり、これらのアイテムをグリッド レイアウトの列に並べ替える必要があるとします。列...

DIVのぼかし機能を実装する方法

マウスを動かしたときにDIVが消えるように手ぶれ補正を使用するdiv タグ自体は onblur イベ...

CSS で実装された円形のプログレスバー

成果を達成する 実装コードhtml <div class="wrap"&g...

Linux で一般的なソフトウェアを設定する方法

新しいLinuxサーバーを入手する場合、通常は次の5つの構成を実行する必要があります。 HOSTAN...

Ubuntu 20.04 に Xrdp サーバー (リモート デスクトップ) をインストールする方法

Xrdp は、グラフィカル インターフェイスを通じてリモート システムを制御できる Microsof...

Linux で特定のプログラムを見つけるための whereis の例の詳細な説明

Linuxは特定のプログラムを見つけますwhereis コマンドは主にプログラム ファイルを検索し、...

DockerコンテナがSongtiなどのフォントを認識しない場合の解決策

問題の背景: docker を使用してプロジェクトをデプロイする場合、プロジェクト内で印刷コントロー...

クリーンなコードのための Web デザインの 12 の法則 [グラフィック]

美しいコードは美しい Web サイトの基礎です。優れた CSS は、同様に優れた HTML の上にの...