印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
Linux Apache でコンテンツを圧縮して配信する

自宅サーバは回線が細いため,コンテンツを圧縮して配信してみることにした。Apache の mod_deflate を使う。

■ ■ ■

背景

このブログサーバは,自宅サーバで (nlog(n): サーバを ThinkPad T42 に交換),少々トラブルがあったりしたが (nlog(n): ThinkPad T42 の Fan Error),元気に動いている。契約回線は ADSL 12M で,実質速度は下り 10 Mbit,上り 1 Mbit である。したがって,このサーバの記事を読む場合の回線速度は 1 Mbit である。それほどアクセスの多いサイトではないが,回線は細いと言える。

サーバの処理能力は高いとは言えないが,自宅内でサーバにアクセスした場合と,自宅外からアクセスした場合では,自宅内の方が圧倒的に早いことから,CPU には余力があると考えられる。

そこで,今回は Apache の mod_deflate を使ってコンテンツの圧縮をすることで,CPU の負荷は高まるが,回線を有効利用させることを考える。

動作環境

動作環境は,Vine Linux 4.2 kernel 2.6.16, Apache 2.2.3 である。

設定

設定に関しては Apacheで圧縮してコンテンツ配信しよう - takami_hirokiの日記 の情報が役に立った。

Vine Linux 4.2 では,Apache の追加モジュールの設定は /etc/apache2/conf.d/ ディレクトリにある *.conf ファイルに書くことになっているので,httpd.conf を直接編集しない方針でいくことにする。

/etc/apache2/conf.d/mod_deflate.conf に次の内容を書いて保存する。

<IfModule !mod_deflate.c>
LoadModule deflate_module modules/mod_deflate.so
</IfModule>
<IfModule mod_deflate.c>
  <Location />
# Insert filter
SetOutputFilter DEFLATE

# 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

# Don't compress images and other uncompressible content
SetEnvIfNoCase Request_URI \
 \.(?:gif|jpe?g|png|bmp|rar|zip|lzh|exe|flv|mov|wma|mp3|avi|swf|mpe?g)$ no-gzip dont-vary

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

この設定は,Apache のマニュアル (mod_deflate) の「ほぼ丸パクリ」で若干の変更を加えている。メインの変更点は,圧縮しないファイルの拡張子を追加したことである。追加したと言っても,これまた他人のコード (Apache Mod_Deflate and Flash SWF Files Don't Like Each Other | Phil Chen) の「ほぼ丸パクリ」で若干の変更を加えている。拡張子 bmp, lzh を追加し,細かいところでは mpeg, mpg の指定の誤植を修正している。

使用している Apache のモジュールは,コンテンツ圧縮用の mod_deflate である。フィルタ登録のための mod_filter は,「FilterProvider」ディレクティブなどを使わないのであれば不要である。

モジュール不足のために Apache に起動に失敗しないように,安全のために IfModule で囲んでいる。動作しない場合は,IfModule を外して試すこと。動作確認が完了したら戻せばよい。Location はサーバ全体にこのルールを適用するために指定している (Location ディレクティブ - core - Apache HTTP サーバ)。

設定が完了したら,サーバを再起動しておく。

# /etc/init.d/apache2 restart

再起動しても動作していないことがあるので,以下で確認する。

動作確認

動作確認には,Firefox のアドオン Live HTTP Headers が使える。アドオンをインストールしたら,「ツール」→「Live HTTP Headers」でウィンドウを開いておき,目的のサーバのページをリロードする。ウィンドウには,リロードされたページのヘッダが表示される。

テキスト,Javascript, CSS などの Content-Encoding が gzip になっていれば動作している。また,gif, jpeg などの画像ファイルやその他の圧縮しないファイルに「Content-Encoding: gzip」がついていないことを確認する。

圧縮されたコンテンツには,「Vary: Accept-Encoding,User-Agent」というヘッダがつく。途中にプロキシサーバがある場合,適切に処理されるようにプロキシサーバに伝えている (サイトの最適化 〜 Vary: Accept-Encoding ヘッダーを設定する - 海外ホスティング入門)。

IE6 では,HTML 以外のコンテンツに圧縮をかけた場合,キャッシュがクラッシュするという話があるので (HTTPコンテンツ圧縮とPlack - blog.nomadscafe.jp),もし追加するなら次の行ということになるだろうか。

BrowserMatch \bMSIE.6\.0 no-gzip

その他ハマりやすい点については,mod_deflate設定で躓く之事 | @哀T が詳しい。

まとめ

このコンテンツ圧縮の設定をしたところ,Web ブラウザでの表示が,見て分かるくらい速くなった。Firefox 3.6,IE 9 での動作確認は行っているが,IE の他のバージョンや,Chrome, Opera, Safari での確認は行っていない。

Posted by n at 2011-09-14 23:52 | Edit | Comments (0) | Trackback(0)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?