UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

nginxでgzip圧縮を有効化する例

Googleは画像や動画、cssやjsファイルのような静的ファイルを配信する際にgzip圧縮を有効化することを推奨しています。これは少しでもファイルの容量を減らして、高速にファイルを配信することで、コンテンツのロード時間を減らし、ウェブサイトの快適ブラウジングを可能にできるからです。

ここではnginxをリバースプロキシとして利用したときのサーバーの設定例を紹介したいと思います。使用するディストリビューションはUbuntu14.04で、nginxのバージョンは1.4.6です。

まずは設定ファイルを開いてみます。

vim /etc/nginx/sites-available/default

さて追記するのはserver{}の部分です。

最初にgzip圧縮を有効化するために以下の記述を追加します。

gzip on;

デフォルトの設定ではnginxはtext/htmlしか圧縮しません。ほかの種類のファイルを圧縮するにはgzip_typesに追加するファイルのmimeタイプを設定します。この例では画像ファイルのjpeg,png,gifとCSS,JavaScriptファイルを設定します

gzip_types image/png image/gif image/jpeg text/javascript text/css;

ほとんどの場合ではgzip圧縮はダウンロード時間の短縮に貢献しますが、極端に容量の小さなファイルの場合、圧縮・展開にかかる時間のほうが余分にかかる場合があります。このような不便を避けるためにgzip_min_lengthで設定が可能です。ここで指定したサイズ以下のファイルは圧縮されずに配信されます。デフォルトの設定は20バイトです。ここでは1000バイトを指定します

gzip_min_length 1000

デフォルトではnginxはプロキシサーバーとして利用した場合に圧縮を行いません。gzip_proxiedで指定することで特定のリクエストに対してgzip圧縮を実行することができます。

この例ではanyを指定することであらゆるタイプのリクエストに対してgzip圧縮を行うことができます。そのほかの設定は公式サイトの

Module ngx_http_gzip_module

を参照してください。

gzip_comp_levelで圧縮度を指定することが可能です。圧縮度を大きくすればその分ファイルのサイズを小さくすることができますが、その分展開に余分な時間がかかります。デフォルトでは1が指定されていますが、ここでは6を指定します。

gzip_comp_level

gzip_disableで特定のユーザーエージェントに対してgzipを無効化することが可能です。この例ではInternet Explorer 1-6(gzip未対応)に対してgzipを無効化します。

gzip_proxied 

ほとんどのクライアントはgzip圧縮に対応していますが、レガシーブラウザを使用している一部のクライアントは圧縮されたファイルを展開することができません。しかし、一般には、リクエストのたびにファイルを圧縮するよりも、圧縮されてからキャッシュされたファイルを配信することが、より効率的なはずです。このように、一部のgzip未対応のブラウザに対してのみ、その都度キャッシュされた圧縮済みのファイルを展開してから配信することを可能にするには以下の記述を加えてください。

gunzip on;

特に重要なのは以下の記述です。静的ファイルを格納してあるフォルダを指定してgzip_staticをonに設定してください。この設定によって、指定したフォルダへのリクエストに対して、nginxはgzip圧縮されたファイルの配信を試みます。もしクライアントがgzip圧縮に対応していない(たとえば古いバージョンのInternet Explorerなど)場合は非圧縮のファイルを配信します。

location / {
gzip_static on;
}

以上をまとめるとconfigファイルに追記する記述は以下の通りになります。

server{
gzip on;
gzip_types image/png image/gif image/jpeg text/javascript text/css;
gzip_min_length 1000;
gzip_proxied any;
gunzip on;

location / {
gzip_static on;
}

}

これらの設定を終えて、ファイルを保存したらnginxを再起動して設定を適用させます。

service nginx restart 

エラーが出なければ、次にgzip圧縮が有効化したか確認します。nginxで指定したフォルダに任意の画像データを入れてテストをしてみましょう。

curl -I -H 'Accept-Encoding: gzip,deflate' https://www.utali.net/images/20160524170331.png

これで

Content-Encoding: gzip

が表示されれば成功です。

HTTP/1.1 200 OK

Server: nginx/1.4.6 (Ubuntu)

Date: Thu, 26 May 2016 02:55:45 GMT

Content-Type: image/png

Last-Modified: Tue, 24 May 2016 08:03:34 GMT

Connection: keep-alive

Vary: Accept-Encoding

Expires: Fri, 27 May 2016 02:55:45 GMT

Cache-Control: max-age=86400

Vary: Accept-Encoding

Content-Encoding: gzip

大丈夫でした。画像ファイルは圧縮されてから配信されていることが確認できました。