Linux Server

Apacheのチューニング(転送データ量削減編)

  

ご注意下さい

この記事は3年以上前に書かれた記事ですので、内容が古い可能性があります。

0
(0)

転送データ量の削減方法にはコンテンツの容量を減らすのももちろんあるのですが、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には以下のようなログが出力されます。

# cat /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であれば上記モジュールは既に組み込まれているのでリコンパイルなどの作業が必要ありません。
割とお手軽に転送量が削減できるので試してみてください。

この記事は役に立ちましたか? | Is this article useful for you?

評価をお願いします | Please leave your rating.

平均 | Av.: 0 / 5. 投票数 | Votes: 0

最初の評価を下さい | Please vote for the first rating.

-Linux Server
-, ,

© 1999 - 2021 蒲田ネット