モバイルページ向けの画像をリアルタイムで作成するために「lsyncd」を使ってみた
2010年度5月分のGIGAZINEのアクセス解析結果でも述べられていますが、モバイル版GIGAZINE(http://m.gigazine.net/)の画像の大きさと画質を向上させました。その画像作成には「lsyncd」を用いています。
lsyncdはLinux 2.6.13から導入されたinotifyと呼ばれるファイルシステムイベント監視機構を用いてファイルを同期するためのデーモンで、最新の実装 (現時点で1.33) ではサブディレクトリの再帰的監視、監視ディレクトリを引数としたコマンド実行 (デフォルトではrsyncが実行される) が可能です。
本来、このlsyncdはコンピュータ間でのファイルの同期を行うためのものですが、この「監視ディレクトリを引数としたコマンド実行」の機能を用いて、縮小画像を作成するスクリプトをリアルタイムで作成するようにしてみました。
詳細は以下から。
lsyncd - Project Hosting on Google Code
■インストール
1. 画像サーバに用いているCentOSでは、RPMforgeにlsyncdのパッケージが存在しています。しかし、これは非常に古いバージョンでありスクリプト実行などの必要な機能が欠けているため、lsyncdの公式ページから最新パッケージを取得してコンパイルを行います。まず、lsyncdに必要なパッケージ「libxml2-devel」をRPMforgeから取得します。
yum --enablerepo=rpmforge -y install libxml2-devel
2. lsyncdのtarボールを取得してコンパイルとインストールを行います。
cd /usr/src
wget http://lsyncd.googlecode.com/files/lsyncd-1.33.tar.gz
tar zxvf lsyncd-1.33.tar.gz
cd lsyncd-1.33
./configure --prefix=/usr/local
make
make install
3. 設定ファイルlsyncd.conf.xmlを次のように修正します。targetはなんでもよいと思われますが、念のため/dev/nullを指定しておきます。
<lsyncd version="1"> <settings> <logfile filename="/var/log/lsyncd.log"/> <binary filename="/usr/local/src/mkmbimg.sh"/> <callopts> <source/> </callopts> </settings> <directory> <source path="/var/www/html/img/"/> <target path="/dev/null"/> </directory> </lsyncd>
4. 画像縮小スクリプトmkmbimg.shを作成します。lsyncdはディレクトリレベルでの監視を行い、スクリプトの引数にはディレクトリしか渡さないため、スクリプトでは画像が追加された際にはディレクトリ内の画像をすべて生成するようにしています。これは基本的には第一引数にディレクトリを取り、そのディレクトリ上にある画像から縮小画像を作成するだけです。このスクリプトを重要な部分だけ抜き出すと次のようになります。作成したmkmbimg.shには実行権限を付与しておくのをお忘れなく。
find "$1" -iname \*.jpg -or -iname \*.jpeg -or -iname \*.png -or -iname \*.gif | while read file ; do
if [ -f "$file" ] ; then
convert -type optimize -thumbnail 150x150 -quality 40 -sampling-factor 1x1 -sharpen 1x1 "${file}" "$outfile1"
convert -type optimize -thumbnail 275x275 -quality 50 -sampling-factor 1x1 -sharpen 1x1 "${file}" "$outfile2"
fi
done
■実行
次のようにコマンドを入力します。「--delay 5」とすることでファイルが作成されたりしたときに5秒間待つようにして別のファイルが作成されたときにスクリプトが繰り返し実行されるのを防ぎます。
./lsyncd --delay 5
■実運用上の工夫
デーモンとしてシステム起動時に自動実行できるようにするために、起動スクリプトを作成しています。また、GIGAZINEは現時点で約16000の記事があり、年・月・日・記事ごとに画像ディレクトリを分けているため、総ディレクトリ数は19000ほどになります。 inotifyのディレクトリの監視数は設定変更可能で、デフォルトでは8192と少ないために65536まで増やしています。
echo 'fs.inotify.max_user_watches = 65536' >> /etc/sysctl.conf
・おまけ
モバイル版GIGAZINEの画像の大きさと画質がどれくらい変わったのかを実際の記事の画像から比較してみました。ちなみにファイルサイズでは変更前と変更後で4~5倍の差があります。
あまりにもリラックスしすぎているネコの日常
ロッテリアのチーズバーガー×10段重ね「タワーチーズバーガー」にチャレンジしてみました
ユニフォームが食い込んでお尻がぱっつんぱっつんになっている女性アスリートたち
・関連記事
1秒で10万行を処理するフリーの超高速なログ解析ソフト「Visitors」 - GIGAZINE
Yahoo!やライブドア、2ちゃんねるなどの大規模サイトで採用されている「FreeBSD」をインストールしてみた - GIGAZINE
GIGAZINEを支える2基のXeonプロセッサを搭載した8コアサーバ「HP ProLiant ML150 G5」フォトレビュー - GIGAZINE
パソコンを業務用途にも耐えうる高性能ブロードバンドルータにしてしまう「Vyatta」 - GIGAZINE
GIGAZINE、ついに新サーバへ移転完了 - GIGAZINE
・関連コンテンツ
in モバイル, ネットサービス, Posted by darkhorse_log
You can read the machine translated English article I tried using "lsyncd" to create images ….