CentOS5上で運用しているMyNETSのサイトで今年に入ってからしばしば高負荷が発生してアクセス障害になっていたので、友人らと原因を調査。不幸中の幸いというか高負荷発生時に友人がOSにログインしていたため原因が判明。結果、あるパターンの壊れたアニメGIFのファイルがアップロードされた際にImageMagickが変換しようとして高負荷状態を発生させていた。該当ファイルを抽出し、他のCentOS5のマシンで手動でconvertして再現確認。WindowsやMacOSX,Ubuntuでは該当ファイルはconvertでエラー表示で正しく処理中断になるため、CentOS用パッケージの問題と推測。
既にこちらの内容は役に立ちません
最新のx86_64版の話題はこちらを参照してください
http://blog.isnext.net/issy/archives/362
■ImageMagickのアップデート
CentOSはextraとepelがリポジトリ追加されているが、ImageMagickは
# rpm -q ImageMagick
ImageMagick-6.2.8.0-4.el5_1.1
と、最新の6.6.0-10には遠く及ばない。
しかたがないので、最新版のtarballを落としてきてインストールしてみた。
# cd ~/download
# wget http://downloads.sourceforge.net/project/imagemagick/ImageMagick/00-6.6.0/ImageMagick-6.6.0-10.tar.gz?use_mirror=jaist
# cd ImageMagick-6.6.0-10
# ./configure
# make
# make install
いろいろ警告は表示されるものの一応インストールできた。…が
# convert broken.gif hoge.gif
とすると変わらず高負荷発生。
おそらく警告が出ていた中に対策に必要なものがあるということだろう。
(4/11追記:コンパイルして導入するとデフォルトでは/usr/local/bin/convertにインストールされるため、CentOSのデフォルト/usr/bin/convertと異なり、そもそもここでの動作確認は適切な状況ではなかった)
しかたないので、Fedora用に用意されているrpmファイルをダウンロードしてインストールする。
# cd ~/download
# wget http://www.imagemagick.org/download/linux/fedora/i386/ImageMagick-6.6.0-10.i386.rpm
# rpm -Uvh ImageMagick-6.6.0-10.i386.rpm
エラー: 依存性の欠如:
libHalf.so.4 は ImageMagick-6.6.0-10.i386 に必要とされています
libIex.so.4 は ImageMagick-6.6.0-10.i386 に必要とされています
libIlmImf.so.4 は ImageMagick-6.6.0-10.i386 に必要とされています
libImath.so.4 は ImageMagick-6.6.0-10.i386 に必要とされています
libcdt.so.4 は ImageMagick-6.6.0-10.i386 に必要とされています
libdjvulibre.so.21 は ImageMagick-6.6.0-10.i386 に必要とされています
libfftw3.so.3 は ImageMagick-6.6.0-10.i386 に必要とされています
libgraph.so.4 は ImageMagick-6.6.0-10.i386 に必要とされています
libgvc.so.5 は ImageMagick-6.6.0-10.i386 に必要とされています
libltdl.so.3 は ImageMagick-6.6.0-10.i386 に必要とされています
ということで不足しているパッケージの追加をすべく
http://rpm.pbone.net/
で必要なライブラリを含むパッケージの在りかを探す。
必要なのは
OpenEXR
fftw3
Graphviz
djvulibre
epelでなんとかなるものはそこからinstall
# yum install openexr fftw3
graphvizは最新版が必要なので、本家のCentOS用リポジトリを追加。
# wget http://www.graphviz.org/graphviz-rhel.repo
# mv graphviz-rhel.repo /etc/yum.repos.d/
# yum install graphviz
djvulibreはdagリポジトリにあるのでそこから追加。
# vi /etc/yum.repos.d/dag.repo
[dag]
name=Dag RPM Repository for CentOS5
baseurl=http://ftp.riken.jp/Linux/dag/redhat/el5/en/$basearch/dag/
enabled=0
gpgcheck=1
# rpm --import http://ftp.riken.jp/Linux/dag/RPM-GPG-KEY.dag.txt
# yum --enablerepo=dag install djvulibre
これで再度(追記を確認してください。これやっちゃいけません)
# rpm -Uvh ImageMagick-6.6.0-10.i386.rpm
今度は無事に導入。
# convert broken.gif hoge.gif
convert: negative or zero image size `broken.gif' @ error/gif.c/ReadGIFImage/1237.
convert: missing an image filename `hoge.gif' @ error/convert.c/ConvertImageCommand/2941.
正しくエラーになったので、これでOK。
これCentOSへのDoSになるんで報告すべきか悩み中。
…と思ったら、MyNETSで動作させてみたところ、GIF以外がリサイズできなくなってることが判明。
正しく動作していないのは、Fedora用を使ったからなのか、バージョンアップでコマンド変更があったのか。
追跡調査中。
— 4/11追記 —
調査の結果、Uvhでインストールしてはいけないことを確認。
そりゃそうか。別OS用だしね。
入れ替え時にやること。
既存のImageMagickをアンインストール
アンインストールの確認
# rpm -q ImageMagick
パッケージ ImageMagick はインストールされていません。
一応他に入っていないか、残存libがないか確認
# updatedb
# localte convert
# locate libMagick
CentOSではconvertsは/usr/bin/convertになるので
コンパイルインストール等を行って他にあったら残存lib含めて消しておく
# rm -f /usr/local/bin/convert
# rm -f /usr/local/lib/libMagick*
Fedora用最新版を新規インストール
# rpm -ivh ImageMagick-6.6.0-10.i386.rpm
念のため再起動
これで正しくMyNETSで動作することを確認しました。
CentOSでアニメGIF投稿を受け付けるWebアプリで画像変換にImageMadickを利用している場合には、最新版へのアップデートをオススメします。
centos, imagemagick, mynets

Loading...