レンタルサーバー・自宅サーバー設定・構築のヒント
レンタルサーバー・自宅サーバー設定・構築のヒント - レンタルサーバー・自宅サーバーの設定・構築情報を公開しています。

Nginx でgzipを使うには

2011年6月20日 2015年5月16日
nginx gzip

ここまでで、以下のようにapache からnginx への移行するための環境設定について解説してきました。

今回も引き続き、apache からnginx への移行するための環境設定を行ってみます。

今回は、gzipに関してです。

apacheには、
mod_deflate モジュールというものがあります。

これはサーバからの出力を、ネットワークを 通してクライアントに送る前に情報をgzipで圧縮することを可能にします。

これは、ネットワークの負荷を下げると同時に、転送量が減りますから、伝達時間(情報がクライアントまでに届く時間)が短くなります。

また、最近のパソコン事情から、
圧縮せずに情報をそのまま流して伝達時間を要して表示する時間より
gzipで圧縮・解凍を送り手、受け取り手で実施することで伝達時間を短くした方が、はるかに表示するまでの時間は短いと言われています。

つまり、このgzipでの圧縮を行うことで、実際の表示速度(体感速度)もあがる可能性もあって、なおかつ、回線を有効利用できるということになります。

こんな便利なものを使わない手はありませんね。

では、早速、簡単に解説していみたいと思います。

nginx でgzipを使う

nginx でgzipを使うには、
apacheでは、httpd.confにて設定していた内容を、nginxでは、設定ファイル(/etc/nginx/nginx.conf)で行うだけです。

やり方は、これもapacheに似ていますので、それほど難しくはないと思います。apacheといっしょに簡単に解説してみます。

apacheでgzipを使うには、
.htaccessでも一部行うことができます。
しかし、.htaccessでは設定できないgzipのディレクティブもありますから、基本的には、httpd.confで設定するのが良いと思います。

ここでは、色々なgzipのディレクティブを扱ってみたいので、httpd.confで設定する方法で解説しておきます。

Apache でgzipを使う例

gzipを使うには、
通常、apacheでは、httpd.confにて、以下のような記述を行って対応します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<IfModule deflate_module>
	DeflateFilterNote Input instream
	DeflateFilterNote Output outstream
	DeflateFilterNote Ratio ratio
	LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
	CustomLog logs/deflate.log deflate

	DeflateCompressionLevel 1

	<Location />
		AddOutputFilterByType DEFLATE  \
		    text/plain \
		    text/html \
		    text/xml \
		    text/css \
		    application/xml \
		    application/xhtml+xml \
		    application/rss+xml \
		    application/atom_xml \
		    application/javascript \
		    application/x-javascript \
		    application/x-httpd-php

		# Netscape 4.x has some problems...
		BrowserMatch ^Mozilla/4 gzip-only-text/html

		# Netscape 4.06-4.08 have some more problems
		BrowserMatch ^Mozilla/4\.0[678] no-gzip

		# MSIE masquerades as Netscape, but it is fine
		BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

		BrowserMatch "\bMSIE [1-6]\." no-gzip

		# Don't compress images
		SetEnvIfNoCase Request_URI \
		\.(?:gif|jpe?g|png)$ no-gzip dont-vary

		<IfModule headers_module>
			# Make sure proxies don't deliver the wrong content
			Header append Vary User-Agent env=!dont-vary
		</IfModule>
	</Location>
</IfModule>

これは、apacheのサンプルに2行だけ手を加えたものです。
ほとんどの方は、そのまま使っておられるのではないかと思います。

  • 2 – 6行目:ロギング情報を設定しているだけです。

    ロギングが不要の方は、削除しても問題ないと思います。

    DeflateFilterNote
    ロギング用に圧縮情報を指定された名前のワークエリアに設定します。
    Input :
    フィルタの入力ストリームのバイトカウントをメモに保存する。
    Output :
    フィルタの出力ストリームのバイトカウントをメモに保存する。
    Ratio :
    圧縮率 (出力 / 入力 * 100) をメモに保存する。 type 引数を省略した場合は、これがデフォルトとなります。
  • 8行目:圧縮レベルを1に設定しています。
    gzipで扱うことができる圧縮レベルは、1 – 9 まであります。
    この数値が大きければ、圧縮率は高くなります。ただし、CPUへの負荷も高くなります。
    この点を注意する必要があります。
    CPUのリソースが、余っているサーバーなら、ある程度高い数値を設定しても良いかもしれません。
    ただ、レベル 1 と レベル 9 との間には、それほど劇的な圧縮率の差があるわけではありません。

    例)100kbyteのデータを圧縮した例です。
    圧縮レベル圧縮率
    0100.0165
    122.5511
    222.0703
    321.7447
    420.6508
    520.2351
    620.0666
    720.0314
    819.9218
    919.9198
    ※圧縮レベル0は、圧縮なしなので、gzipのフォーマットに変換した分だけ情報量が増えます。

    ここで

    レベル 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)を編集します。

http {
    ...
    log_format deflate '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for" "$gzip_ratio"';
    access_log        logs/deflate.log deflate;
    ...
    gzip              on;
    gzip_http_version 1.0;
    gzip_types        text/plain 
                      text/html 
                      text/xml 
                      text/css 
                      application/xml 
                      application/xhtml+xml 
                      application/rss+xml 
                      application/atom_xml 
                      application/javascript 
                      application/x-javascript 
                      application/x-httpd-php;
    gzip_disable      "MSIE [1-6]\.";
    gzip_disable      "Mozilla/4";
    gzip_comp_level   1;
    gzip_proxied      any;
    gzip_vary         on;
    gzip_buffers      4 8k;
    gzip_min_length   1100;
    ...
    server {
         server_name www.example.com;
          :
    }
}

この色の箇所が編集箇所で、gzipの設定を行っている箇所になります。
やっている内容は、ほぼ同じです。

gzip on;
gzipを使いますという宣言です
gzip_http_version 1.0;
gzipを使うときのHTTPバージョンです。1.1を指定することもできますが、ここは1.0が無難です。
gzip_types text/plain … ;
gzipの対象になるファイル形式をmimeタイプで指定します。
gzip_disable “MSIE [1-6]\.”;
gzipの非対象にする。ここでは、MicroSoft IE のバージョン1 から 6 までを非対象にしています。
gzip_disable “Mozilla/4”;
gzipの非対象にする。ここでは、Netscape のバージョン4 を非対象にしています。
gzip_comp_level 1;
gzipの圧縮レベルを1に設定しています。
gzip_proxied any;
Proxy経由での要求でもgzipの対象とするように設定しています。
このとき、gzip_vary on;をしおくべきです。
Proxyでは、このVaryヘッダ情報から、コンテンツの振り分け作業を行うことがあります。
gzip_vary on;
ヘッダ情報に Vary 情報を付加するように設定しています。
この情報は、gzip_disableが非対象となった場合でも出力されてしまいます。
本来は、非対象となった場合は出力しない、あるいは、gzip_disableのようにエージェント情報などで切り分けられるなどの処置が必要だと思います。

ここは、gzip_proxiedgzip_varyoffが無難かもしれません。
gzip_buffers 4 8k;
gzipで使うバッファのサイズを設定しています。4 x 8k = 32k のメモリが常時利用されることになります。
gzip_min_length 1100;
gzip対象とする最小ファイルサイズを設定します。ここでは、1100 byte 以下の場合は、圧縮しないことになります。
apacheでは設定していないような、あまり必要のない設定もあります。
ここでは、nginxのgzipの設定がメインテーマなので、できる限り細かく設定してみました。

gzipが正しく動作しているか確認してみる

ここまで、gzipの設定を行ってみました。
ここでは、この設定が正しく動作しているか確認してみましょう。

確認の仕方は、ロギングによる確認とtelnetによる確認があります。

ロギングについては、apache nginx ともに上記で既に設定しています。

ここでは、telnetで確認してみましょう。
やり方は簡単です。telnetでウェブサーバーへ接続してHTTPヘッダ情報を取得します。 そのヘッダ情報を確認することでgzipが正しく動作しているか確認できます。

$ telnet www.example.com 80
Trying 111.222.111.222...
Connected to www.example.com.
Escape character is '^]'.
HEAD / HTTP/1.1return
host:www.example.comreturn
User-Agent:MSIE 7.return
Accept-Encoding:deflate,gzipreturn
return
HTTP/1.1 200 OK
Server: nginx/1.0.4
Date: Sat, 18 Jun 2011 22:09:33 GMT
Content-Type: text/html; charset=utf-8
Last-Modified: Thu, 28 Apr 2011 03:03:40 GMT
Connection: keep-alive
Vary: Accept-Encoding
Content-Encoding: gzip

部分が、telnetでのコマンドイメージです。
return は、改行(return)を意味します。

部分が、ヘッダ内でのgzipに関する情報です。

Vary: Accept-Encoding は、この情報はAccept-Encodingをクライアント(ブラウザ)から受けた情報ですよという意味。 Vary変わるという意味なので、Accept-Encodingの値によってコンテンツが変わりますよという意味。(詳細は、北市真さんのコメント参照)
Content-Encoding: gzip は、この情報はgzipで圧縮されていますという意味。
Content-Length: 20 は、圧縮後のこの情報の長さ(バイト数)の意味。

以下は、エージェント情報をMSIE 6にしたときの様子です。

$ telnet www.example.com 80
Trying 111.222.111.222...
Connected to www.example.com.
Escape character is '^]'.
HEAD / HTTP/1.1return
host:www.example.comreturn
User-Agent:MSIE 6.return
Accept-Encoding:deflate,gzipreturn
return
HTTP/1.1 200 OK
Server: nginx/1.0.4
Date: Sat, 18 Jun 2011 22:17:11 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 3698
Last-Modified: Thu, 28 Apr 2011 03:03:40 GMT
Connection: keep-alive
Vary: Accept-Encoding
Accept-Ranges: bytes

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程度遅延するらしいです。)


このようにnginxでもgzipが使えます。
良くも悪くも高速化を意識している感じを受けます。
例えば、Content-Lengthは、gzipでは出力されないなど、出力する情報を必要最小限に絞って、かつ高速にリアクションできるような流れになっているのがうかがえますね。

apacheに慣れている方には、apacheとの違いに戸惑うかもしれませんね。自分は、今でもこれらの違いが気になったりします。(追記 : 北市真さんのコメントも参考にされると良いと思います。)

また、telnetでもある程度動作しているか確認できるので、設定を終えたら、自分の設定が正しいかどうか確認することをおすすめします。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない検索ができないことがあります。


関連記事 :

nginx でKeepAliveを設定してみる

以前に ApacheのKeepAliveを考える で Apache による KeepAlive について記事を書きました。 今回は、その ...

FreeBSDでapacheをインストール

さて、今回は、apacheのインストール手順です。 これができれば、Wordpress,Joomla!などphp + mysqlの組み合わせの ...

Nginxのproxyでキャッシュを削除する方法

前回「Nginx をリバースプロキシ(キャッシュ) として使ってみた」では、 nginxをリバースプロキシサーバーとして使ってみま ...

Nginx + php-fpm をさくらのVPSで使ってみた

ここまで、細かいnginx , php-fpmの関するセッティングについて、簡単に解説してきました。 Nginxの最新版ソ ...

ウェブサーバー経由で証明書を公開する

プライベート認証局の証明書、サーバー証明書、クライアント証明書の作成方法について で各証明書を作成しました。 それらの証明書は、各使用者へ配布 ...


4 件 コメントがあります。 コメントを投稿する
  1. 北市真
    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の挙動は妥当に思えます。

  2. 管理人
    2014年1月20日, 5:23 PM

    北市真さん
    コメントありがとうございます、管理人です。
    あらためて語彙力、文章能力のない自分が情けないです。
    Vary: Accept-Encodingの意味あいについては、修正させてもらいました。
    また、何かありましたらコメントいただけるとありがたいです。


コメントを投稿 :

お名前 *

メールアドレス *
( メールアドレスが公開されることはありません。)

サイトアドレス

コメント *

* 印の項目は、入力が必要な項目です。




最近投稿の記事

[ 画像提供元 : Amazon ] 先日、1TBのディスクの入れ替え時にバックアップをとろうとディスクコピーを行いました。 その際 ...

Windows で Linux ファイルシステム Ext4 のディスクをマウントするには? Ext3Fsd が、おそらく、最も簡単なツール ...

今回は、Windows で Compass を使ってみました。 Compass とは、 Sass(サス、Syntactica ...

今回は、Anti Adblock を使ってみました。 Anti Adblock とは、 そもそも Adblock という ウェブ ...

デスクトップ環境でない サーバーで、Webページのキャプチャー画像をコマンドで撮る には、wkhtmltoimage, CutyCapt ...


さくらのVPS 全プラン リニューアルです。(石狩(北海道)も選択可)


root権限ありで ¥685 / 月 ~ と非常にリーズナブルな CPU 1(core)の 512 プランから、 最高 CPU 10(core), メモリ 32(GB), SSD容量 800(GB) までとプランが充実。
ディスクは、SSDとHDDの選択が可能になった他、データセンターは人気の東京、石狩(北海道)となりました。

また、どのプランでも好きなOSが選べます
( CentOS, Fedora, Scientific Linux, FreeBSD, Ubutu, Debian )

管理人もおすすめのVPSです。
試用期間がありますから、一度、お試しを!!

詳しくは、http://vps.sakura.ad.jp/さくらのVPSのサイトへ へどうぞ!!

カテゴリ


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。
最近、スワップにも対応した Serverman@VPS は、かなりリーズナブルかもです。

  • メモリ1GB~2GBのEntryプラン :月額:490円
  • メモリ2MB~4GBのStandardプラン :月額:980円
  • メモリ4GB~8GBのProプラン :月額:1,980円

新規申し込みで1ヶ月間完全無料となるキャンペーンを実施中です。
Serverman@VPSの特徴は、安さとIPv6対応です。また、初期設定費0円もポイントです。

IPv6でちょっと遊んでみたい方には、おすすめかもしれませんね。最低利用期間もありませんから、気に入らないときは即解約もできます。

Serverman@VPSの詳細については、 http://dream.jp/vps/ Serverman@VPSのサイトへへどうぞ。



KVM採用 ConoHa VPSは、時間単位で借りれる便利なVPSです。


ConoHa VPS は、初期設定費0円最低利用期間無し時間単位で清算可能、 さらに、Web APIを使って自動化を図ることもできる便利なVPSです。

海外サーバー設置も可能で、ローカル接続にも対応と、かなり、機能豊富なサーバーです。

新規ユーザ登録で、クーポンもらえますから、まずは、お試しですね。

ConoHa VPSの詳細については、
http://www.conoha.jp/ へどうぞ。

KVM採用 お名前.com VPS(KVM) 2G プラン 初期設定費無料 キャンペーン 実施です。


メモリ2GBプラン CPU:3core、Disk:200GB
月額:1,153円から (初期設定:1,680円0円)

さくらのVPSがリニューアルされてもなんのその。
1GBメモリ / 2Core を ¥834 – の格安価格で提供中です!
間違いなくスペックからすると割安感ありです。
年間割引時の途中解約で返金がないのは、 ちょっと残念ですが、それでもこの割安感は魅力です。

まずは、お試しですね。

お名前.com VPS(KVM)の詳細については、
http://www.onamae-server.com/vps/ へどうぞ。(お試し期間が15日あります。)



  • ソーシャルブックマーク

  • はてなブックマークへ追加するはてな登録数
ページトップへ
Time : 0.2767 [s]