CentOS7のNginxにgzipモジュールを追加する方法
序章
Webサイトの読み込み速度は、ブラウザでダウンロードする必要のあるすべてのファイルのサイズによって異なります。 送信するファイルのサイズを小さくすると、Webサイトの読み込みが速くなるだけでなく、帯域幅の使用量を支払う必要がある人にとっても安価になります。
gzipは人気のあるデータ圧縮プログラムです。 gzip
を使用して、オンザフライで提供されるファイルを圧縮するようにNginxを構成できます。 これらのファイルは、取得時にそれをサポートするブラウザによって解凍されますが、Webサーバーとブラウザ間で転送されるデータの量が少ないという利点があります。
圧縮が一般的に機能する方法だけでなく、gzip
がどのように機能するかにより、特定のファイルは他のファイルよりも圧縮率が高くなります。 たとえば、テキストファイルは非常によく圧縮され、結果として2分の1以上小さくなることがよくあります。 一方、JPEGやPNGファイルなどの画像は、その性質上すでに圧縮されており、gzip
を使用した2回目の圧縮ではほとんどまたはまったく結果が得られません。 ファイルを圧縮するとサーバーリソースが消費されるため、結果としてサイズが大幅に減少するファイルのみを圧縮することをお勧めします。
このガイドでは、CentOS 7サーバーにインストールされているNginxを構成して、gzip
圧縮を利用して、Webサイトの訪問者に送信されるコンテンツのサイズを縮小する方法について説明します。
前提条件
このチュートリアルに従うには、次のものが必要です。
- sudo非rootユーザーを持つ1台のCentOS7サーバー
- CentOS7にNginxをインストールする方法チュートリアルに従ってサーバーにインストールされたNginx
ステップ1—テストファイルの作成
このステップでは、デフォルトのNginxディレクトリにいくつかのテストファイルを作成して、gzip
の圧縮をテキスト化します。
ネットワーク上で提供されるファイルの種類を決定するために、Nginxはファイルの内容を分析しません。これは、十分な速度が得られないためです。 代わりに、ファイル拡張子を検索して、ファイルの目的を示すMIMEタイプを判別します。
この動作のため、テストファイルの内容は関係ありません。 ファイルに適切な名前を付けることで、Nginxをだまして、1つの完全に空のファイルが画像であり、もう1つのファイルがスタイルシートであると思わせることができます。
この構成では、Nginxは非常に小さなファイルを圧縮しないため、正確に1キロバイトのサイズのテストファイルを作成します。 これにより、Nginxが必要な場所で圧縮を使用しているかどうかを確認でき、あるタイプのファイルを圧縮し、他のタイプのファイルでは圧縮しません。
truncate
を使用して、デフォルトのNginxディレクトリにtest.html
という名前の1キロバイトのファイルを作成します。 拡張子は、それがHTMLページであることを示します。
sudo truncate -s 1k /usr/share/nginx/html/test.html
同じ方法でさらにいくつかのテストファイルを作成しましょう。1つはjpg
イメージファイル、1つはcss
スタイルシート、もう1つはjs
JavaScriptファイルです。
sudo truncate -s 1k /usr/share/nginx/html/test.jpg sudo truncate -s 1k /usr/share/nginx/html/test.css sudo truncate -s 1k /usr/share/nginx/html/test.js
ステップ2—デフォルトの動作を確認する
次のステップは、作成したばかりのファイルを使用して、新規インストールでの圧縮に関してNginxがどのように動作するかを確認することです。
test.html
という名前のHTMLファイルが圧縮されて提供されているかどうかを確認しましょう。 このコマンドは、Nginxサーバーにファイルを要求し、HTTPヘッダー(Accept-Encoding: gzip
)を使用してgzip
圧縮コンテンツを提供しても問題がないことを指定します。
curl -H "Accept-Encoding: gzip" -I http://localhost/test.html
応答として、いくつかのHTTP応答ヘッダーが表示されます。
Nginx応答ヘッダー
HTTP/1.1 200 OK Server: nginx/1.6.3 Date: Fri, 11 Mar 2016 12:53:06 GMT Content-Type: text/html Content-Length: 1024 Last-Modified: Fri, 11 Mar 2016 12:48:02 GMT Connection: keep-alive ETag: "56e2be82-400" Accept-Ranges: bytes
回答には、gzip
についての言及は一切ありません。 これは、サーバーでgzip
圧縮が有効になっていないことを示しています。 これは、CentOS 7では、gzip
のサポートがデフォルトのNginx構成で完全に無効になっているためです。 圧縮が有効になっている場合、出力にContent-Encoding: gzip
という追加のヘッダーが表示されます。
HTMLページだけでなく、新規インストール上の他のすべてのファイルも非圧縮で提供されます。 これを確認するには、同じ方法でtest.jpg
という名前のテスト画像をリクエストできます。
curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg
結果は、以前と実質的に同じになるはずです。
Nginx応答ヘッダー
HTTP/1.1 200 OK Server: nginx/1.6.3 Date: Fri, 11 Mar 2016 12:58:03 GMT Content-Type: image/jpeg Content-Length: 1024 Last-Modified: Fri, 11 Mar 2016 12:48:05 GMT Connection: keep-alive ETag: "56e2be85-400" Accept-Ranges: bytes
出力にもContent-Encoding: gzip
ヘッダーはありません。これは、ファイルが圧縮なしで提供されたことを意味します。
テストCSSスタイルシートを使用してテストを繰り返すことができます。
curl -H "Accept-Encoding: gzip" -I http://localhost/test.css
繰り返しになりますが、出力には圧縮についての言及はありません。
CSSファイルのNginx応答ヘッダー
HTTP/1.1 200 OK Server: nginx/1.6.3 Date: Fri, 11 Mar 2016 12:59:04 GMT Content-Type: text/css Content-Length: 1024 Last-Modified: Fri, 11 Mar 2016 12:48:05 GMT Connection: keep-alive ETag: "56e2be85-400" Accept-Ranges: bytes
ステップ3—Nginxのgzipモジュールを有効にして構成する
次のステップは、圧縮の恩恵を受けることができるすべてのファイル形式の圧縮を有効にするようにNginxを構成することです。
gzip
モジュールはNginxのコアモジュールです。つまり、すでにインストールされていますが、有効にして構成する必要があります。 CentOS 7へのNginxの新規インストールでは、/etc/nginx/conf.d
ディレクトリの.conf
拡張子を持つすべてのファイルが自動的にロードされます。 これにより、追加のモジュールを簡単に構成できます。
Nginx gzip
モジュールを有効にするには、nano
またはお好みのテキストエディターを使用して、gzip.conf
という名前の構成ファイルを作成します。
sudo nano /etc/nginx/conf.d/gzip.conf
以下の内容を貼り付けてください。
/etc/nginx/conf.d/gzip.conf
## # `gzip` Settings # # gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; 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/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
ファイルを保存して閉じ、終了します。
ここで適用される構成設定を見ていきましょう。
gzip on
ディレクティブは、Gzip圧縮を有効にします。gzip_disable "msie6"
は、IE6がgzip
をまったくサポートしていないため、圧縮ファイルを受信するブラウザーからInternetExplorer6を除外します。gzip_vary
およびgzip_proxied
の設定により、ブラウザーとサーバー間のプロキシサーバーが圧縮を正しく認識できるようになります。gzip_comp_level 6
は、圧縮されるファイルの量を設定します。 数値が大きいほど、圧縮レベルとリソース使用量が高くなります。 6は妥当な中間点です。gzip_http_version 1.1
は、gzip
圧縮をHTTP/1.1プロトコルをサポートするブラウザーに制限するために使用されます。 ブラウザがサポートしていない場合は、gzip
もサポートしていない可能性があります。gzip_min_length 256
は、256バイト未満のファイルを圧縮しないようにNginxに指示します。 非常に小さなファイルは、圧縮の恩恵をほとんど受けません。gzip_types
は、圧縮されるすべてのMIMEタイプを一覧表示します。 この場合、リストにはHTMLページ、CSSスタイルシート、JavascriptおよびJSONファイル、XMLファイル、アイコン、SVG画像、およびWebフォントが含まれます。
新しい構成を有効にするには、Nginxを再起動します。
sudo systemctl restart nginx
ステップ4—新しい構成を確認する
次のステップは、構成への変更が期待どおりに機能したかどうかを確認することです。
各テストファイルでcurl
を使用し、Content-Encoding: gzip
ヘッダーの出力を調べることにより、手順2で行ったのと同じようにこれをテストできます。
curl -H "Accept-Encoding: gzip" -I http://localhost/test.html
応答として、以前は存在しなかったContent-Encoding: gzip
ヘッダーが表示されます。
Nginx応答ヘッダー
HTTP/1.1 200 OK Server: nginx/1.6.3 Date: Fri, 11 Mar 2016 13:19:16 GMT Content-Type: text/html Last-Modified: Fri, 11 Mar 2016 12:48:02 GMT Connection: keep-alive Vary: Accept-Encoding Content-Encoding: gzip
他のすべてのファイルも同じ方法でテストできます。
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
を使用することはそれを改善するための1つの大きなステップです。