« 東京ドーム北側の道路は休日路上駐車可能です | メイン | 海外決済サービス 比較メモ »
2009年02月02日
mod_xsend_file で画像配信サーバーの負荷軽減
合宿で青い人に mod_xsendfile を教えてもらって「あわせて読みたい」に入れてみたら結構いい感じなのでメモ。
■mod_xsendfile とは
PHPなどのスクリプトから静的なファイル(画像ファイルなど)を送信するときに使う便利な apache モジュール。
■仕組み
header("X-Sendfile: (画像ファイルパス)");
と出力すれば、X SendFile がローカルから画像ファイルを引っ張ってきて、Last-Modified などのヘッダ情報をつけて後の処理をしてくれる。
つまり、スクリプトを使っていながら簡単に静的なファイルを送信しているように見せることができる。
(※セキュリティ設定に関係なく、任意のパスを指定できるところがミソ)
■「あわせて読みたい」では
これまで、Location: ヘッダをつかってリダイレクトして画像を表示させていた。
この方式の欠点は:
・常に 301/302 のリダイレクトを返すので、PHPファイル自体がキャッシュの対象とならず毎回ブラウザからアクセスされる
・HTTP/1.1 で連続送信されるとはいえ、1リクエストに対して apache のスレッドが 2 つ使われる。
・リクエストの If-None-Match などのヘッダにスクリプト側で対応する必要があった。
※リダイレクトをつかわず、PHP ファイルで readfile() などから静的ファイルを直接配信する方法もあるのですが、PHPのプロセス時間を長くとるコストは大きく、画像ファイルのサイズが一定以上になるとリダイレクトさせた方が効率的になります。
■で、Before / After
直接画像を出力するようにして、プロセス数が減少。
これまでキャッシュの制御がいい加減すぎたのか、転送量も減少傾向。
■ということで
ちょっと効果ありそうで、こういった画像を返すような処理には良いかもしれませんね。
#と、今後は Amazon S3 などを利用した配信が主流になると思いますが・・・というかそうしたい。
■補足、インストール方法
CentOS などでは、
# yum install httpd-devel
# wget http://tn123.ath.cx/mod_xsendfile/mod_xsendfile.c
# /usr/sbin/apxs -cia mod_xsendfile.c
とかでインストールできると思います。
あとは httpd.conf などに XSendFile on と記述して apache 再起動すれば OK。簡単です。
投稿者 aka : 2009年02月02日 15:16 / 2009年02月 / サーバー管理
トラックバック
このエントリーのトラックバックURL:
http://133.242.136.64/mt-tb-sf.cgi/719