ご注意下さい
この記事は3年以上前に書かれた記事ですので、内容が古い可能性があります。
転送データ量の削減方法にはコンテンツの容量を減らすのももちろんあるのですが、apacheでできることもあります。
今回はそんな話です。
通信系路上のパケットを圧縮して転送量を削減
mod_deflateを利用して/etc/httpd/conf/httpd.confに以下のような記述をし、圧縮を有効にします。
CentOSのapacheであれば特別なインストールは不要なはず。
~ LoadModule deflate_module modules/mod_deflate.so # <-- 記載があることの確認 ~ <IfModule mod_deflate.c> SetOutputFilter DEFLATE # example of how to compress ONLY html, plain text, xml, javascript and css AddOutputFilterByType DEFLATE text/html text/plain text/xml text/js text/javascript text/css # Don't compress binaries SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|tar|bz2|sit|rar) no-gzip dont-vary # Don't compress images SetEnvIfNoCase Request_URI .(?:gif|jpe?g|jpg|ico|png|tif|tiff) no-gzip dont-vary # Don't compress movie and audio files SetEnvIfNoCase Request_URI .(?:divx|iso|avi|wmv|mov|3gp|wav|mp3) no-gzip dont-vary # Don't compress PDFs SetEnvIfNoCase Request_URI .pdf no-gzip dont-vary # Don't compress flash files (only relevant if you host your own videos) SetEnvIfNoCase Request_URI .(?:flv|swf) no-gzip dont-vary # 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 MSIE !no-gzip !gzip-only-text/html # Make sure proxies don't deliver the wrong content Header append Vary User-Agent env=!dont-vary # Compression level 1-9 ( 9 is highest compression level ) DeflateCompressionLevel 7 # Setup custom deflate log DeflateFilterNote Input instr DeflateFilterNote Output outstr DeflateFilterNote Ratio ratio LogFormat '"%r" %{outstr}n/%{instr}n (%{ratio}n%%) %{User-agent}i' deflate </IfModule> ~ <VirtualHost 192.168.00.200> ServerAdmin webmaster@kamata-net.com DocumentRoot /home/httpd/html/wordpress/ ServerName blog.kamata-net.com ErrorLog logs/kamata-net.com-error_log TransferLog logs/kamata-net.com-access_log CustomLog logs/kamata-net.com-access_log combined CustomLog logs/deflate_log deflate #<-- 追加 </VirtualHost>
/var/log/httpd/deflate_logには以下のようなログが出力されます。
"GET /archives/1814.html HTTP/1.1" 13753/64884 (21%) SAMSUNG-SGH-E250/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)
"GET /wp-content/archives/IMGP1005.jpg HTTP/1.1" -/- (-%) Mozilla/5.0 (Linux; U; Android 4.2.2; ja-jp; SOL23 Build/14.1.C.1.227) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 GSA/3.2.17.1009776.arm
"GET /archives/2014/01/WS000183.jpg HTTP/1.1" 5060/19206 (26%) facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)
"GET /archives/2014/01/WS000183.jpg HTTP/1.1" 5060/19206 (26%) facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)
"GET /wp-content/archives/2011/06/9882CAEB-6C82-4A2D-A54C-BC927AC2977718.jpg HTTP/1.1" -/- (-%) Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53
"GET /archives/004078.html HTTP/1.1" -/- (-%) Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
"GET /feed/atom HTTP/1.1" -/- (-%) Feedbin - 1 subscribers
"GET /page/93?paged=122 HTTP/1.1" 5047/19182 (26%) DoCoMo/2.0 N905i(c100;TB;W24H16) (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)
#
削減量が分かって良いですね。しかしfacebookからのアクセスの再にjpgが圧縮かかってしまうのはなぜなんだろう…。
クライアントにキャッシュさせてリクエストを削減
画像やcss、jsファイルなどは何度アクセスしてもそうそう変わるものではありませんのでクライアント側にキャッシュさせてそもそものリクエストを減らしてしまいましょう。
.htaccessに記述をしてもいいのですが、/etc/httpd/conf/httpd.confに記述をしてしまいます。
ただし、wordpressのディレクトリ配下しかキャッシュを効かせたくないので以下のように記述します。
~ LoadModule expires_module modules/mod_expires.so # <-- 記載があることの確認 ~ <IfModule mod_expires.c> <Directory "/home/httpd/html/wordpress"> ExpiresActive on ExpiresByType image/png "access plus 1 months" ExpiresByType image/jpeg "access plus 1 months" ExpiresByType image/gif "access plus 1 months" ExpiresByType text/css "access plus 1 months" ExpiresByType text/javascript "access plus 1 months" ExpiresByType application/x-javascript "access plus 1 months" ExpiresByType application/x-shockwave-flash "access plus 1 months" #ExpiresDefault "access plus 1 days" <-- 上記以外はキャッシュ化させたくない(リクエストさせる)のでコメントアウト </Directory> </IfModule>
ExpiresByType image/png "access plus 1 months"であれば、PNG画像ファイルに対して前回アクセスしてから1ヶ月はキャッシュを保存させる指示を出します。
ExpiresDefaultを指定してしまうと、動的コンテンツについてもキャッシュさせることになってしまう為ここでは画像ファイルとJSやCSSのみのしています。
CentOSのapacheであれば上記モジュールは既に組み込まれているのでリコンパイルなどの作業が必要ありません。
割とお手軽に転送量が削減できるので試してみてください。