mod_small_lightを利用して画像のリサイズを行う
指定したサイズで画像をリサイズするため、サーバ側でリサイズ処理を可能にするApacheモジュール「mod_small_light」を導入して試してみました。
同様の処理を行ってくれるmod_dimsやmod_tofuなどもありますが、Nginx版も開発されているmod_small_lightを使ってみました。
開発環境
- Vagrantで構築
- OS: CentOS 6.4
- Apache 2.2.15
mod_small_light利用に必要なもの
mod_small_lightを利用するために必要なものの導入や設定をしていきます。
Apacheモジュールを追加するために必要なapxsを導入。
$ sudo yum install httpd-devel
apxs導入確認。
$ ll /usr/sbin/apxs -rwxr-xr-x 1 root root 22029 1月 12 17:09 2017 /usr/sbin/apxs
画像変換エンジンにImageMagickとimlib2を利用できるため、2つを導入していきます。
ImageMagick導入。
$ sudo yum -y install ImageMagick ImageMagick-devel
ImageMagick導入確認。
$ convert -version Version: ImageMagick 6.7.2-7 2016-06-16 Q16 http://www.imagemagick.org Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC Features: OpenMP
imlib2導入。
$ yum install http://dl.fedoraproject.org/pub/epel/6/x86_64/imlib2-1.4.2-5.el6.x86_64.rpm \ http://dl.fedoraproject.org/pub/epel/6/x86_64/imlib2-devel-1.4.2-5.el6.x86_64.rpm
imlib2導入確認。
$ yum list installed | grep imlib2 imlib2.x86_64 1.4.2-5.el6 @/imlib2-1.4.2-5.el6.x86_64 imlib2-devel.x86_64 1.4.2-5.el6 @/imlib2-devel-1.4.2-5.el6.x86_64
以下の3つのモジュールが有効になっている必要があります。
rewrite、proxy、proxy_http
モジュールが有効になっているか確認。
$ apachectl -M | grep rewrite rewrite_module (shared)
mod_small_light導入
mod_small_light導入
$ cd /usr/local/src $ git clone https://github.com/yamac/smalllight.git $ cd smallight $ ./configure --with-apxs=/usr/sbin/apxs \ --with-Wand-config=/usr/bin/Wand-config \ --with-imlib2-config=/usr/bin/imlib2-config \ $ sudo make $ sudo make install
パーミッション変更(すでに775の場合はやる必要がないです。)
$ chmod 755 /usr/lib64/httpd/modules/mod_small_light.so
mod_small_lite導入とApacheモジュール追加を確認
$ ll /usr/lib64/httpd/modules/mod_small_light.so -rwxr-xr-x 1 root root 150140 2月 24 13:01 2017 /usr/lib64/httpd/modules/mod_small_light.so
$ cat /etc/httpd/conf/httpd.conf | grep small_light LoadModule small_light_module /usr/lib64/httpd/modules/mod_small_light.so
$ apachectl -M | grep small_light_module small_light_module (shared)
mod_small_light利用設定
指定URLでアクセス時にリサイズ画像を表示させるために、httpd.confを修正します。
httpd.confバックアップ。
$ cd /etc/httpd/conf $ sudo cp httpd.conf httpd.conf.bak
httpd.confの任意の場所に以下を記述。
RewriteEngine on RewriteRule ^/images/(.+)$ /images/$1 [L] RewriteRule ^/resize/(.+)x(.+)/(.+)$ /small_light(dw=$1,dh=$2,ds=s,e=imagemagick)/$3 [P,L] RewriteRule ^/small_light[^/]*/(.+)$ /images/$1 <LocationMatch ^/small_light[^/]*/> SetOutputFilter SMALL_LIGHT </LocationMatch>
上記の記述内容の説明です。
・/iamges/画像名でアクセスされたときはリサイズしていない画像を表示。
・/resize/100x100/画像名でアクセスされたときは、100x100でリサイズした画像を表示(100は任意の数字)
・e=imagemagickを記述することで、画像変換エンジンにImagemagickを利用できます。
httpd.confを修正したので、Apacheの再起動。 *1
$ sudo service httpd restart
画像リサイズ結果
リサイズ前と後の画像を表示します。
mod_small_lightによって指定サイズにリサイズされていることが分かります。
リサイズ前(http://192.168.33.10/images/image.jpg)
リサイズ後(http://192.168.33.10/resize/100x100/image.jpg)
まとめ
mod_small_lightは、Apacheモジュールとして追加するだけで画像リサイズができるので便利ですね。
ただ、当たり前ですが画像リサイズの処理に時間がかかるので、画像キャッシュなどを上手く利用する必要があります。
今後は、高速なJPEG圧縮ライブラリ「Libjpeg-Turbo」を導入した状態でのリサイズや、もう一つの画像変換エンジンであるimlib2とImagemagicの処理スピードや画像リサイズのクオリティ比較などをやっていきたいと思います。
参考
mod_small_light で動的に画像リサイズ - akishin999の日記
ImageMagick + 画像サムネイル作成 Apache モジュール SMALL LIGHT をインストール - Code Life
Google Code Archive - Long-term storage for Google Code Project Hosting.
*1:当初CentOS7、Apache2.4の環境でmod_small_lightの導入を考えていましたが、mod_small_light導入後のApacheの再起動が上手くできず今回の環境に変更しました。
なぜできなかったのか、未だに謎です。。。