NginxでBrotliを実装します-ほとんど無料でバイトを節約できます

この記事は、ユーザーへのWebアプリケーションの配信速度に関心があり、追加のミリ秒とキロバイトの節約を絞りたいすべての人に役立ちます。











ブロトリとは?



これは、Googleが開発した新しいデータ圧縮標準です。 Clouflareには、他のアルゴリズムとの優れた説明と比較があります。



簡単に言うと、これは静的辞書やその他の最適化を使用してWebアプリケーション(HTML、CSS、JSなど)に最適化された新しい種類の圧縮です。 これは、gzipと比較して圧縮率が高く、最大設定(および非常に低速)ではるかに優れた圧縮で、同等の速度を示します。 速度と圧縮率の詳細な調査については、Cloudflareの記事を参照してください。



ライブWebサイトの実際のファイル(JS、CSS)を含む小さなテーブルを提供します。 圧縮する前に、すべてのファイルが縮小されました。 zopfli (i500)-圧縮設定が11(最大)のgzip互換のコンプレッサーとbrotliを比較します。

ファイルの種類と圧縮 サイズ(バイト) サイズ(元の%)
CSSソースファイル 334 937 100%
CSS zopfli 60,771 18.1%
CSSブロツリ 56 168 16.7%
Jsソースファイル 477 393 100%
Jsゾプリ 149,905 31.4%
Js Brotli 135 766 28.4%


この表から、静的モードでのユースケースの節約量を見積もることができます(ファイルが事前に圧縮され、そのままNginxに提供される場合)。 動的コンテンツの圧縮はもう少し複雑です-圧縮率と圧縮時間のバランスを維持する必要があります。



私自身、次のルールを思いつきました: zopfligzip 9と比較して約10%節約でき、 brotliはさらに10%節約できます。



ブラウザのサポート



今すぐ使用するのに十分です。 caniuse.comによるとこれは視聴者の約50%です。 実際、brotliはChrome 51以降、Firefox 47以降、およびモバイルChromeでサポートされているため、さらに多くのことを考えています。 重要な追加:brotliはgzipと互換性がないため、HTTPSリソースでのみサポートされます 。 これは、あらゆる種類の愚かなプロキシがコンテンツに勝てないようにするためです。



カスタマーサポートを確認するのは簡単です。リクエストヘッダーでaccept-encoding brを示す必要があります。これは「brotli」を意味します。 たとえば、次のように:



accept-encoding: gzip, deflate, sdch, br
      
      





Nginxでサポートを有効にする



残念ながら、 Nginxにbrotliサポート用の標準モジュールはまだありません。 しかし、これで私たちを止めることはできません。Google自体とCloudflareからのサードパーティモジュールがあります。 十分に文書化されており、必要な機能をすべて備えているため、Googleのオプションを使用します。



ここでは、 brotliの使用方法を決定する必要があります。静的バージョン( brotli_static )のみ、または動的バージョン( オンザフライの圧縮-brotli)のみです。 brotli_staticモードでのモジュールの構築は、brotliを圧縮するためのライブラリーlibbrotliを必要としないため、より簡単です



PPAの既製パッケージを使用します



Ubuntu 16.04をサーバーとして使用します。 ここでPPAは私たちの助けになります: https : //launchpad.net/~hda-me/+archive/ubuntu/nginx-stable PPAから、多くの追加モジュールを備えたNginx Stableブランチを取得します。 それらのほとんどは動的です。つまり、必要に応じて接続できます。 このオプションに慣れている場合は、設定して設定に移動できます。



自分でNginxを構築する



この場合、プロセスは他のモジュールでNginxを構築することに似ています。 まず、Nginxソースをダウンロードして解凍します(現在のバージョンは公開時に示されています)。



 wget https://nginx.org/download/nginx-1.11.4.tar.gz
      
      





ngx_brotliモジュールのコードを取得します。



 git clone https://github.com/google/ngx_brotli.git
      
      





ダイナミックモードでbrotliを使用する場合は、libbrotliをダウンロードします。



 git clone https://github.com/bagder/libbrotli.git
      
      





そして(libbrotliフォルダーに)収集します:



 ./autogen.sh ./configure make
      
      





または、前に指定したPPAからlibbrotliをインストールできます。



 sudo add-apt-repository ppa:hda-me/nginx-stable sudo apt-get update sudo apt-get install libbrotli
      
      





brotli_staticのみが必要な場合は、Nginxを構築する前に次のことについて話します。



 export NGX_BROTLI_STATIC_MODULE_ONLY=1
      
      





ここで、Nginxソースのあるフォルダーに移動し、それを収集します(オプション--add-module = [ngx_brotliへのパス]を使用 ):



 ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-stream_geoip_module=dynamic --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--as-needed' --add-module=/home/db/ngx_brotli make
      
      





次に、Nginx をインストールmake install )するか、debパッケージにコンパイルします:



 sudo checkinstall --pkgname=nginx --pkgversion=1.11.4 --nodoc
      
      





Nginx設定



それで、ついにnginxbrotliがサポートされました。 (事前に圧縮された)静的なbrotliファイルを使用するには、 nginx.conf構成httpセクション)に1つのディレクティブを含めるだけで十分です。



 brotli_static on;
      
      





現在、nginxは、クライアントがbrotliのサポートを要求している場合、接尾辞が.brのファイルのバージョンを検索します。 見つからない場合は、gzip_staticモジュールが機能します(有効な場合)。



動的モードをアクティブにするには、次のパラメーターを指定します。



 brotli on; brotli_comp_level 6; brotli_types text/plain text/css text/xml application/x-javascript;
      
      





ここでは、品質とパフォーマンスの比率が高いため、圧縮レベル6を使用します。 圧縮レベルはgzip 9よりも優れています。 以下は、圧縮するコンテンツのMIMEタイプです。 目的のタイプのコンテンツに圧縮が適用されるように、サーバー上のMIMEタイプの構成を確認してください。 Brotligzipよりも優先されるため、サポートの場合(静的モードでも)に使用されます。



brotliの動作を確認するのは簡単です。応答ヘッダーを見てください。



 content-encoding:br
      
      





それだけです:最適化に成功し、新しいテクノロジーを使用します!



PS Ubuntu 16.04を使用している場合、brotliコンソール圧縮ユーティリティのインストールは非常に簡単です。



 sudo apt-get install brotli
      
      






All Articles