takedajs ログ

備考録

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)

f:id:takedajs:20170226193923p:plain

リサイズ後(http://192.168.33.10/resize/100x100/image.jpg)

f:id:takedajs:20170226193934p:plain

まとめ

mod_small_lightは、Apacheモジュールとして追加するだけで画像リサイズができるので便利ですね。
ただ、当たり前ですが画像リサイズの処理に時間がかかるので、画像キャッシュなどを上手く利用する必要があります。
今後は、高速なJPEG圧縮ライブラリ「Libjpeg-Turbo」を導入した状態でのリサイズや、もう一つの画像変換エンジンであるimlib2とImagemagicの処理スピードや画像リサイズのクオリティ比較などをやっていきたいと思います。

参考

mod_small_light で動的に画像リサイズ - akishin999の日記

ImageMagick + 画像サムネイル作成 Apache モジュール SMALL LIGHT をインストール - Code Life

GitHub - yamac/smalllight: The SMALLLIGHT is a module of Apache2 which provides a dynamic image transformation.

Google Code Archive - Long-term storage for Google Code Project Hosting.

*1:当初CentOS7、Apache2.4の環境でmod_small_lightの導入を考えていましたが、mod_small_light導入後のApacheの再起動が上手くできず今回の環境に変更しました。
なぜできなかったのか、未だに謎です。。。