Ubuntu16.04でgzipモジュールをNginxに追加する方法
序章
Webサイトの読み込み速度は、ブラウザでダウンロードする必要のあるすべてのファイルのサイズによって異なります。 送信するファイルのサイズを小さくすると、Webサイトの読み込みが速くなるだけでなく、帯域幅の使用量を支払う必要がある人にとっても安価になります。
gzipは人気のあるデータ圧縮プログラムです。 gzip
を使用して、オンザフライで提供されるファイルを圧縮するようにNginxを構成できます。 これらのファイルは、取得時にそれをサポートするブラウザによって解凍されますが、Webサーバーとブラウザ間で転送されるデータの量が少ないという利点があります。
圧縮が一般的に機能する方法だけでなく、gzip
がどのように機能するかにより、特定のファイルは他のファイルよりも圧縮率が高くなります。 たとえば、テキストファイルは非常によく圧縮され、結果として2分の1以上小さくなることがよくあります。 一方、JPEGやPNGファイルなどの画像は、その性質上すでに圧縮されており、gzip
を使用した2回目の圧縮ではほとんどまたはまったく結果が得られません。 ファイルを圧縮するとサーバーリソースが消費されるため、結果としてサイズが大幅に減少するファイルのみを圧縮することをお勧めします。
このガイドでは、Ubuntu 16.04サーバーにインストールされているNginxを構成して、gzip
圧縮を利用して、Webサイトの訪問者に送信されるコンテンツのサイズを減らす方法について説明します。
前提条件
このチュートリアルに従うには、次のものが必要です。
- Ubuntu16.04チュートリアルを使用した初期サーバーセットアップに従ってセットアップされた1つのUbuntu16.04サーバー(sudo非rootユーザーとファイアウォールを含む)
- Ubuntu16.04チュートリアルにNginxをインストールする方法に従ってサーバーにインストールされたNginx
ステップ1—テストファイルの作成
このステップでは、デフォルトのNginxディレクトリにいくつかのテストファイルを作成して、gzip
の圧縮をテキスト化します。
ネットワーク上で提供されるファイルの種類を決定するために、Nginxはファイルの内容を分析しません。これは、十分な速度が得られないためです。 代わりに、ファイル拡張子を検索して、ファイルの目的を示すMIMEタイプを判別します。
この動作のため、テストファイルの内容は関係ありません。 ファイルに適切な名前を付けることで、Nginxをだまして、1つの完全に空のファイルが画像であり、もう1つのファイルがスタイルシートであると思わせることができます。
この構成では、Nginxは非常に小さなファイルを圧縮しないため、正確に1キロバイトのサイズのテストファイルを作成します。 これにより、Nginxが必要な場所で圧縮を使用しているかどうかを確認でき、あるタイプのファイルを圧縮し、他のタイプのファイルでは圧縮しません。
truncate
を使用して、デフォルトのNginxディレクトリにtest.html
という名前の1キロバイトのファイルを作成します。 拡張子は、それがHTMLページであることを示します。
- sudo truncate -s 1k /var/www/html/test.html
同じ方法でさらにいくつかのテストファイルを作成しましょう。1つはjpg
画像ファイル、1つはcss
スタイルシート、もう1つはjs
JavaScriptファイルです。
- sudo truncate -s 1k /var/www/html/test.jpg
- sudo truncate -s 1k /var/www/html/test.css
- sudo truncate -s 1k /var/www/html/test.js
次のステップは、作成したばかりのファイルを使用して、新規インストールでの圧縮に関してNginxがどのように動作するかを確認することです。
ステップ2—デフォルトの動作を確認する
test.html
という名前のHTMLファイルが圧縮されて提供されているかどうかを確認しましょう。 このコマンドは、Nginxサーバーからファイルを要求し、HTTPヘッダー(Accept-Encoding: gzip
)を使用してgzip
圧縮コンテンツを提供しても問題がないことを指定します。
- curl -H "Accept-Encoding: gzip" -I http://localhost/test.html
応答として、いくつかのHTTP応答ヘッダーが表示されます。
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 19 Jan 2016 20:04:12 GMT
Content-Type: text/html
Last-Modified: Tue, 04 Mar 2014 11:46:45 GMT
Connection: keep-alive
Content-Encoding: gzip
最後の行に、Content-Encoding: gzip
ヘッダーがあります。 これは、gzip
圧縮がこのファイルの送信に使用されたことを示しています。 これは、Ubuntu 16.04で、Nginxがデフォルト設定でインストール後にgzip
圧縮を自動的に有効にしているために発生しました。
ただし、デフォルトでは、NginxはHTMLファイルのみを圧縮します。 新規インストールのその他すべてのファイルは、圧縮されずに提供されます。 これを確認するには、同じ方法でtest.jpg
という名前のテスト画像をリクエストできます。
- curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg
結果は以前とは少し異なるはずです。
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 19 Jan 2016 20:10:34 GMT
Content-Type: image/jpeg
Content-Length: 0
Last-Modified: Tue, 19 Jan 2016 20:06:22 GMT
Connection: keep-alive
ETag: "569e973e-0"
Accept-Ranges: bytes
出力にContent-Encoding: gzip
ヘッダーはありません。これは、ファイルが圧縮なしで提供されたことを意味します。
テストCSSスタイルシートを使用してテストを繰り返すことができます。
- curl -H "Accept-Encoding: gzip" -I http://localhost/test.css
繰り返しになりますが、出力には圧縮についての言及はありません。
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 19 Jan 2016 20:20:33 GMT
Content-Type: text/css
Content-Length: 0
Last-Modified: Tue, 19 Jan 2016 20:20:33 GMT
Connection: keep-alive
ETag: "569e9a91-0"
Accept-Ranges: bytes
次のステップは、圧縮されたHTMLファイルだけでなく、圧縮の恩恵を受けることができる他のファイル形式も提供するようにNginxを構成することです。
ステップ3—Nginxのgzip設定を構成する
Nginx gzip
構成を変更するには、メインのNginx構成ファイルをnano
またはお好みのテキストエディターで開きます。
- sudo nano /etc/nginx/nginx.conf
次のようなgzip
設定セクションを見つけます。
. . .
##
# `gzip` Settings
#
#
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
. . .
デフォルトでは、gzip
圧縮はgzip on
ディレクティブによって有効になっていますが、いくつかの追加設定は#
コメント記号でコメント化されています。 このセクションにいくつかの変更を加えます。
- コメントされたすべての行のコメントを解除して(つまり、行の先頭にある
#
を削除して)、追加の設定を有効にします。 gzip_min_length 256;
ディレクティブを追加します。これは、Nginxに256バイト未満のファイルを圧縮しないように指示します。 これは非常に小さいファイルであり、圧縮によるメリットはほとんどありません。gzip_types
ディレクティブに、Webフォント、ico
アイコン、およびSVGイメージを示す追加のファイルタイプを追加します。
これらの変更が適用されると、設定セクションは次のようになります。
. . .
##
# `gzip` Settings
#
#
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
. . .
ファイルを保存して閉じ、終了します。
新しい構成を有効にするには、Nginxをリロードします。
- sudo systemctl reload nginx
次のステップは、構成への変更が期待どおりに機能したかどうかを確認することです。
ステップ4—新しい構成を確認する
各テストファイルでcurl
を使用し、Content-Encoding: gzip
ヘッダーの出力を調べることで、手順2で行ったのと同じようにこれをテストできます。
- curl -H "Accept-Encoding: gzip" -I http://localhost/test.html
- curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg
- curl -H "Accept-Encoding: gzip" -I http://localhost/test.css
- curl -H "Accept-Encoding: gzip" -I http://localhost/test.js
これで、画像ファイルであるtest.jpg
のみが非圧縮のままになります。 他のすべての例では、出力にContent-Encoding: gzip
ヘッダーが含まれているはずです。
その場合は、Nginxでgzip
圧縮を正常に構成しています。
結論
gzip
圧縮を完全に使用するようにNginx構成を変更するのは簡単ですが、そのメリットは計り知れません。 帯域幅が制限されている訪問者は、サイトをより速く受信するだけでなく、Googleはサイトの読み込みがより速くなることを喜んでいます。 スピードは現代のウェブの重要な部分として勢いを増しており、gzip
を使用することはそれを改善するための大きな一歩です。