HimaJyunこのブログでは、帯域の削減とページ表示を高速化する目的でgzip圧縮して転送しています。設定」とかで調べると「ん?、それ必要なの?/間違ってない?」と思う様な設定例が沢山ヒットします。「自分の設定が完璧だ!」と主張するつもりはありませんが、少しでも正しい(と思える)情報を掲載したいので。圧縮して転送すると?圧縮して転送するのはページの表示速度を向上する目的でもほぼ全方位からおススメされている方法です。圧縮にCPUリソースを利用しますが、上り帯域の節約や転送に掛かる時間が短縮される事を考えるとむしろプラスです。(一般的に、ネットワークを含むI/O操作はCPUを遊ばせます)この時代にmod_deflateが使えない鯖の方が少ないと思うので、出来る事ならばやっておいた方が良いでしょう。以下の様な例が良くヒットしますが、間違ってますよ。</IfModule></IfModule>割と分かりづらいミス。DEFLATEを設定すると全てのコンテンツが圧縮されます。後ろにあるAddOutputFilterByTypeは無駄!!imageだろうがzipだろうがなんでもかんでも全部圧縮しちゃいます。こっちは正しい以下のパターンはとても多いですね、このやり方は正しいです。</IfModule></IfModule>全部圧縮する設定にした後、画像を圧縮の対象外にしているので大丈夫です。application/x-httpd-php......?圧縮の設定にapplication/x-httpd-phpを含めている例を見掛けます。コンテンツが圧縮のフィルタを通るのは「最終的な出力」に対してです。PHPなどで処理した結果に対してフィルタが適用されるのです。PHPはデフォルトで「text/html」として結果を出力します、application/x-httpd-phpの指定は何の意味も持ちません。AddOutputFilterByTypeは古い先程の例でも上げた様に、MIMEを指定して圧縮するにはAddOutputFilterByTypeを利用するのですが、このAddOutputFilterByTypeはApache2.1以降で非推奨(deprecated)になり、2.3.7からはcore機能から「mod_filter」の機能へと移行されました。「mod_filter+AddOutputFilterByType」を使えば良いのですが、どうせmod_filterを使うのですから、「FilterProvider」を利用した方が良いと思います。Compressionと言った設定がヒットします。'text/html'"コッチの方が新しい設定方法この鯖での設定例このサーバでは以下の様に設定してみました。</IfModule></IfModule>コメントアウトの部分は必要ないですが、なぜ排除したのかも説明したいので記載しています。1つずつ解説して行きますね。1は圧縮レベルを1で圧縮する事を意味します。ちなみに、(環境にも依りますが)デフォルトは6で圧縮されていました圧縮レベルは1~9の範囲で、数字が大きいほど高圧縮です。「高圧縮の方が良いでしょ?」と思われがちですが、圧縮レベルを上げると当然ながらCPUの負荷(圧縮に必要な時間)が増えます。もって、圧縮レベルを1~9にした場合でもそう大差ありません。数%ほど変わるかな?、くらいです。実際に1~9まで試してみました。72.0%ご覧の通り、殆ど変わりませんね。レベルが上がるほど圧縮率の伸びが悪くなって行ってます。1と9の差はたったの4%。CPU負荷を上げて圧縮するくらいならば、画像の色数なり枚数なりを減らした方が良いです。この様に、上げても殆ど無意味なため圧縮レベルは1、欲張ってもせいぜい2か3まででしょう。当初は良くある例で上げたような全圧縮設定にしてから、拡張子指定で画像を圧縮の対象から除外する設定を利用していたのですが、PHPで画像を動的に生産するとその中身が何だろうが勝手に圧縮しやがりました。それでは困ると言うか、二度手間なのでMIMEタイプ指定で圧縮する方法を選びました。change=yes;byteranges=no元の記事では.icoがimage/x-iconでしたが、この鯖ではimage/vnd.microsoft.iconなのでそれに合わせて書き換えました。あと、見るからに正規表現なので一部の文字をエスケープしています。text/(html|css|plain|xml)ではなくtext/と指定する事でMIMEタイプがtext/から始まる物(HTML,CSS......すなわち平文のコンテンツ)は全て圧縮対象になります。change=yes;byteranges=noと言った指定があるのですが、この指定を(最低でもchangeは)入れないと静的コンテンツなのにETagやキャッシュが効かなかったりします。304でキャッシュが有効なのに効かないからと毎回gzipして転送していたのでは本末転倒ですからね。拡張子指定で除外する方法とMIME指定、どちらを使うかは完全に好みなのでお好きな方を採用して下さい。一部の画像は圧縮出来る「画像だから圧縮しない」と言う考え方は短絡的で好ましくありません。画像でも圧縮出来る物もあるので良く考えてから設定しましょう。SVG、確かに画像ですが中身はXMLです、圧縮できます。ICO、確かに画像ですが、圧縮すると1/10くらいのサイズになります。今回は含んでいませんが、bmp画像は基本的に無圧縮なので圧縮出来ます。!gzip-only-text/htmlこれはgzipの解凍に問題を抱えるブラウザは圧縮せずに転送する設定ですが、こんな平安時代に和歌を詠みあげてた様なブラウザを未だに使っている人間は居ません。(人間以外なら(悪質なbotとかなら)居るかもね。)仮に居たとしても、CSS3やHTML5が主流、HTTP/1.1が大前提、場合によってはHTTP/2やSNIを使っているかという今の時代では、もはや表示する事すらままならないでしょう。個人的には、これらの設定は省いてしまって構わないと思います。設定してたって無駄なマッチングが発生するだけですしね。Accept-Encoding」が追加されてますね。text/htmlVaryというのは「そのヘッダがあるとコンテンツが変わるよ」、つまり今回の場合「Accept-Encodingの内容に応じてコンテンツが変わるよ」という意味です。これによってプロキシ側でAccept-Encodingの有無を見てキャッシュを振り分けたりします。設定してもしなくても良いでしょう。僕はサーバのアドミンです、ルートです、スーパーユーザです、confを直接触れます。Errorになります。CGI版PHPにはdeflate圧縮できない?CGI版PHPの出力を.htaccessで設定したdeflateで圧縮する様に設定しても圧縮が効きません。その場合はphp.iniのzlib.output_compressionをOnにすると良いでしょう。「設定終わった、はい終了!!」は愚か者のする事です。設定が終わったら必ず意図した通りに動くか確認しましょう。以下の様なツールを使えば簡単に確認できます。サーバーApacheスポンサーリンクB!LINEへ送る関連記事Ubuntu(またはRaspbian)のMuninでrrdcachedを使う僕の管理するサーバはMuninでリソース監視をしています。Piをサーバと......続きを読む→PREVApacheをpreforkからeventに切り替えるNEXT[Bukkit/Spigot]Dynmapにレイヤーを追加する方法ナカのヒト:HimaJyun​散って美しいのは桜だけです、情報はまとまっていた方が美しいのです。