読者です 読者をやめる 読者になる 読者になる

apacheで、mod_deflateでレスポンスをgzipしたけどネットワークトラフィックが増えている?

iOSのネイティブアプリでの掲示板サービスの、jsonを返すバックエンドのAPIのサーバーをつくってます。 ネットワークトラフィックを減らそうと思って、apachegzip圧縮をすることにしました。 コンテンツの圧縮率をみたら、処理によって、圧縮できているところと、 むしろ圧縮以前より容量が増えたものがあったりして、よくわからないので備忘録的にまとめました\(^o^)/オワタ

必要なmodule

  • mod_deflate.so コンテンツを圧縮するモジュール
  • mod_filter.so 圧縮対象を選択するモジュール

設定

httpd.confに記述するだけ。 やった環境 centOS 6.5, Apache/2.2.15 モジュールversion

  • モジュールの読み込み
LoadModule deflate_module modules/mod_deflate.so
LoadModule filter_module modules/mod_filter.so
  • モジュールの利用
#Gzipの圧縮の設定
# 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

# ここからフィルター設定
FilterDeclare Compression CONTENT_SET
FilterProvider Compression DEFLATE Content-Type $text/plain
FilterProvider Compression DEFLATE Content-Type $text/css
FilterProvider Compression DEFLATE Content-Type $application/xhtml
FilterProvider Compression DEFLATE Content-Type $application/xml
FilterProvider Compression DEFLATE Content-Type $application/json
FilterProvider Compression DEFLATE Content-Type $application/xhtml+xml
FilterProvider Compression DEFLATE Content-Type $application/rss+xml
FilterProvider Compression DEFLATE Content-Type $application/atom+xml
FilterProvider Compression DEFLATE Content-Type $application/x-javascript
FilterProvider Compression DEFLATE Content-Type $image/svg+xml
FilterProvider Compression DEFLATE Content-Type $text/html
FilterProvider Compression DEFLATE Content-Type $application/javascript
FilterChain Compression
# ここまでフィルター設定

# Don't append Vary heder for specific files
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|zip|lzh|exe)$ dont-vary

# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
Header append Vary Accept-Encoding env=!dont-vary

# gzipでの圧縮率をログに吐き出す(確認用)
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%) %{User-agent}i' deflate
CustomLog logs/deflate_log deflate

ちなみに一番下にある、deflate_logを見ると、mod_deflateによる圧縮率を見ることができます。

"GET /example/badge HTTP/1.1" 45/37 (121%) 
"GET /example/list?offset=1&per_page=20&seed=26 HTTP/1.1" 1835/5221 (35%) 

送信データの多いもの(掲示板の一覧表示画面)は、大幅に圧縮できているけど、 送信データ量の少ないもの(新着通知のバッチのカウントを返すもの)は、むしろ容量が増えている(?)

これはなんでだろう。

上記謎と、gzip圧縮によるCPU使用の増加率とかも、サービスイン後に調べてみようとおもいます! リリース前は、あれもやりたい!これもやりたい!ということがあって、

サービスインするまでには、インフラやアプリ・運用を見据えた仕組みでやっとけばいいことというのは本当に無数にあって、 リリース前までにやるべきこと以外で、捨てることは本当に多いなと痛感しながら日々進めております。