ここまでで、以下のようにapache からnginx への移行するための環境設定について解説してきました。
今回も引き続き、apache からnginx への移行するための環境設定を行ってみます。
今回は、gzipに関してです。
apacheには、
mod_deflate モジュールというものがあります。
これはサーバからの出力を、ネットワークを 通してクライアントに送る前に情報をgzipで圧縮することを可能にします。
これは、ネットワークの負荷を下げると同時に、転送量が減りますから、伝達時間(情報がクライアントまでに届く時間)が短くなります。
また、最近のパソコン事情から、
圧縮せずに情報をそのまま流して伝達時間を要して表示する時間より
gzipで圧縮・解凍を送り手、受け取り手で実施することで伝達時間を短くした方が、はるかに表示するまでの時間は短いと言われています。
つまり、このgzipでの圧縮を行うことで、実際の表示速度(体感速度)もあがる可能性もあって、なおかつ、回線を有効利用できるということになります。
こんな便利なものを使わない手はありませんね。
では、早速、簡単に解説していみたいと思います。
- 目次
- 履歴
2011年6月20日 初版
2013年5月16日 他ディストリビューション対応
2014年1月20日 Vary: Accept-Encodingの意味あい修正
nginx でgzipを使う
nginx でgzipを使うには、
apacheでは、httpd.confにて設定していた内容を、nginxでは、設定ファイル(/etc/nginx/nginx.conf)で行うだけです。
やり方は、これもapacheに似ていますので、それほど難しくはないと思います。apacheといっしょに簡単に解説してみます。
.htaccessでも一部行うことができます。
しかし、.htaccessでは設定できないgzipのディレクティブもありますから、基本的には、httpd.confで設定するのが良いと思います。
ここでは、色々なgzipのディレクティブを扱ってみたいので、httpd.confで設定する方法で解説しておきます。
Apache でgzipを使う例
gzipを使うには、
通常、apacheでは、httpd.confにて、以下のような記述を行って対応します。
|
|
これは、apacheのサンプルに2行だけ手を加えたものです。
ほとんどの方は、そのまま使っておられるのではないかと思います。
- 2 – 6行目:ロギング情報を設定しているだけです。
ロギングが不要の方は、削除しても問題ないと思います。
DeflateFilterNote
ロギング用に圧縮情報を指定された名前のワークエリアに設定します。
Input :
フィルタの入力ストリームのバイトカウントをメモに保存する。
Output :
フィルタの出力ストリームのバイトカウントをメモに保存する。
Ratio :
圧縮率 (出力 / 入力 * 100) をメモに保存する。 type 引数を省略した場合は、これがデフォルトとなります。
- 8行目:圧縮レベルを1に設定しています。
gzipで扱うことができる圧縮レベルは、1 – 9 まであります。
この数値が大きければ、圧縮率は高くなります。ただし、CPUへの負荷も高くなります。
この点を注意する必要があります。
CPUのリソースが、余っているサーバーなら、ある程度高い数値を設定しても良いかもしれません。
ただ、レベル 1 と レベル 9 との間には、それほど劇的な圧縮率の差があるわけではありません。
例)100kbyteのデータを圧縮した例です。
圧縮レベル 圧縮率 0 100.0165 1 22.5511 2 22.0703 3 21.7447 4 20.6508 5 20.2351 6 20.0666 7 20.0314 8 19.9218 9 19.9198
ここで
レベル 1 : 22.5511 % レベル 9 : 19.9198 % ----------------------------- 差 : 2.6313 %
たかだか、2.6 % 程度です。
100 kbyte x 2.6 % = 2.6 kbyte の差でしかありません。
この差分のためにCPU負荷を上げる意味がどれだけあるか・・・ということです。
このため一般的にCPUにあまり負荷をかけないためにレベル1あるいは2を使うことが多いです。
- 11 – 22行目:圧縮対象とするmimeタイプを設定しています。
- 24 – 28行目:NetScape に対する圧縮について制限をかけています。
- 30 – 31行目:MS IE に対する圧縮について制限を全て解除しています。
- 33行目:MS IE バージョン 1 から 6 に対して圧縮しないように設定しています。
- 35 – 37行目:画像ファイルに関しては、圧縮しないように設定しています。
- 40 – 41行目:Vary ヘッダー情報を画像ファイル以外では、出力するように設定しています。
Nginx でgzipを使う例
先のApacheでの例をnginxで実現するには、以下のように設定ファイル(/etc/nginx/nginx.conf)を編集します。
|
この色の箇所が編集箇所で、gzipの設定を行っている箇所になります。
やっている内容は、ほぼ同じです。
このとき、gzip_vary on;をしおくべきです。
Proxyでは、このVaryヘッダ情報から、コンテンツの振り分け作業を行うことがあります。
本来は、非対象となった場合は出力しない、あるいは、gzip_disableのようにエージェント情報などで切り分けられるなどの処置が必要だと思います。
ここは、gzip_proxiedもgzip_varyもoffが無難かもしれません。
ここでは、nginxのgzipの設定がメインテーマなので、できる限り細かく設定してみました。
gzipが正しく動作しているか確認してみる
ここまで、gzipの設定を行ってみました。
ここでは、この設定が正しく動作しているか確認してみましょう。
確認の仕方は、ロギングによる確認とtelnetによる確認があります。
ロギングについては、apache nginx ともに上記で既に設定しています。
ここでは、telnetで確認してみましょう。
やり方は簡単です。telnetでウェブサーバーへ接続してHTTPヘッダ情報を取得します。
そのヘッダ情報を確認することでgzipが正しく動作しているか確認できます。
|
赤部分が、telnetでのコマンドイメージです。
は、改行(return)を意味します。
青部分が、ヘッダ内でのgzipに関する情報です。
Vary: Accept-Encoding は、この情報はAccept-Encodingをクライアント(ブラウザ)から受けた情報ですよという意味。
Varyは変わるという意味なので、Accept-Encodingの値によってコンテンツが変わりますよという意味。(詳細は、北市真さんのコメント参照)
Content-Encoding: gzip は、この情報はgzipで圧縮されていますという意味。
Content-Length: 20 は、圧縮後のこの情報の長さ(バイト数)の意味。
以下は、エージェント情報をMSIE 6にしたときの様子です。
|
Content-Encoding: gzip は、無くなりました。
そのため、この情報がgzipで圧縮されていないことを意味します。
ただし、Vary: Accept-Encodingは、常に出力されることに注意してください。
バグでは無いようなのですが、apacheでは、gzipを使っていない場合は、Varyの出力もされませんが、nginxは、そのまま出力されます。
また、Content-Length: 3698が出力されています。
gzipを使った場合、nginxでは、Content-Lengthが出力されないことに注意してください。
apacheでは、gzipを使用した場合でもgzipで圧縮されたバイト数がContent-Lengthで出力されます。
Content-Lengthが出力されないからと言っても問題になることは、それほど無いかもしれません。
ほとんどの場合、クライアントでは、このContent-Lengthによってソケットを閉じるかどうかの判断をしているに過ぎないと思われるので、それほどの影響がでることは無いでしょう。
ただ、実際にFireFox,Operaなどでは、受信完了までの待ち時間が余分に長くなると言われています。( 数10ms – 数100ms程度遅延するらしいです。)
良くも悪くも高速化を意識している感じを受けます。
例えば、Content-Lengthは、gzipでは出力されないなど、出力する情報を必要最小限に絞って、かつ高速にリアクションできるような流れになっているのがうかがえますね。
apacheに慣れている方には、apacheとの違いに戸惑うかもしれませんね。自分は、今でもこれらの違いが気になったりします。(追記 : 北市真さんのコメントも参考にされると良いと思います。)
また、telnetでもある程度動作しているか確認できるので、設定を終えたら、自分の設定が正しいかどうか確認することをおすすめします。
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
2012年11月6日, 9:06 PM
[…] http://server-setting.info/centos/apache-nginx-6-gzip-use.html […]
2012年12月31日, 4:27 PM
[…] http://server-setting.info/centos/apache-nginx-6-gzip-use.html […]
2014年1月16日, 12:10 AM
有用な記事をありがとうございます。
参考にさせていただきます。
一つだけ気になったのですが、
> Vary: Accept-Encoding は、この情報はAccept-Encodingをクライアント(ブラウザ)から受けた情報ですよという意味。
とありますが、Varyは、Accept-Encodingの値によってコンテンツが変わる(gzipされたりされなかったり)ので、その内容によってキャッシュを使い分けなさい(gzip版のキャッシュを持っていても、Accept-Encodingがgzipではない時にはキャッシュを使わずまたリクエストしなさい)という事ではないでしょうか。
(参考:http://www.studyinghttp.net/header#Vary)
とすると、Nginxの挙動は妥当に思えます。
2014年1月20日, 5:23 PM
北市真さん
コメントありがとうございます、管理人です。
あらためて語彙力、文章能力のない自分が情けないです。
Vary: Accept-Encodingの意味あいについては、修正させてもらいました。
また、何かありましたらコメントいただけるとありがたいです。