Help us understand the problem. What is going on with this article?

imagickを使うためにImageMagickの最新版をインストールする話

なんやらかんやら指摘していますが非常に浅い領域の話なので熟練者はスルーしてください

はじめに

個人的にLAMP環境でImageMagickを使った開発が多いのだが資料が少ない&古い。
毎回LAMPのセットアップでコケる要因がこのimagickとImageMagickの導入である。
仮想環境も含め数十回は実行したこの導入作業、いい加減アーカイブしておこうと思った次第。
(スナップショット取っとけと言う話はさておいて)
まずImagickとImageMagickの違いから。

Imagickとは

phpマニュアルによるとImagickとは

Imagick は、ImageMagick API を使用して画像の作成や修正を行う ネイティブ PHP 拡張モジュールです。

見ての通りImageMagickが無いとImagickは使用出来ない。
カレーとカレーパンぐらい違う話であり、php開発者なら言わずもがなの話である。
実装時にソースコードには基本的に「ImageMagick」という単語はほぼ出てこない。

$img = new Imagick($filePath);

というようにソース上使用するのはImagickである。

ImageMagickとは

OSS NEWSより

ImageMagick(イメージマジック)とは、画像処理ライブラリです。コマンドラインツールやAPIライブラリとして利用します。非常に多くの画像フォーマットに対応し、高機能な画像処理機能を提供します。

あくまでライブラリであり用途はphpに留まらない。
.NET,C++,Python,Rubyなど導入可能言語は多岐に渡り、
各々MiniMagickやMagick.NETなどの拡張モジュールを導入して使用することになる。
話が戻るがこれらがphpで言うところのImagickである。

ImageMagickの問題

以前から薄々認識はしていたが、なんせ脆弱性に関する不具合が多い。
「ImageMagick 脆弱性」でググると山のように記事がヒットする。
主にJVNによる指摘をピックアップ。
ImageMagick における境界外読み取りに関する脆弱性
ImageMagick におけるリソース管理に関する脆弱性
ImageMagick におけるバッファエラーの脆弱性

ていうかもうビルドバージョンレベルで指摘があるやん…
幅広い機能を持つが故かとにかく多い。
ポンコツコーダーの自分としてはひとまず最新版を入れて対処するしかないというのが悲しいところ…。
少しでもリスクを下げるべくの対処法をそれしか持ってないのは反省点である。

ImageMagick使わんかったらええやん!

というのが最も早い解決法なのだが、今はイチから学習し直す時間がないので
ひとまず前述のとおり最新版で対応したい。

代替案、ガチめの対策案についてはこちらの記事が詳しいので参考に。
「さようなら ImageMagick」の考察
ImageMagickを使うWebアプリのセキュリティ

本題

ということで力不足の自分はImageMagickは最新版を入れて対処しようという方針なので
その方法をご紹介。

作業環境はこちら

  • MacOS Mojave 10.14.3
  • Vagrant
    • CentOS 7.4
    • Apache 2.4.x
    • php 7.2.x

インストールするものとしては大まかに

  • ImageMagick-libs
  • IamgeMagick
  • ImageMagick-devel
  • php-pear (Imagickインストール用のライブラリ)
  • phpize (pecl用ライブラリだが依存パッケージ補完で大体勝手に入る)
  • Imagick

まずImageMagickのインストールから

yum install ImageMagick

とやると大事故につながる

デフォルトリポジトリのImageMagickは6.x系なのでコレの流れで進めていくと
依存関係モジュールもそれに合ったものが入ってしまい、気づいた時にはどれがどの依存パッケージなのか分からなくなりもう色々アレになってしまう。
最近気付くのが遅れこれをやらかしてしまい、AWSのインスタンスを1個潰すハメになってしまった。

ImageMagickは公式のrpmを使用する

最新版が配布されているのでここを使う。
ImageMagick公式
現時点では7.0.8.68

最初にLibsから

yum install https://imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-libs-7.0.8-68.x86_64.rpm

※2019/10/07追記
まっさらなサーバだと色々依存ライブラリが足りないとエラーが出て進まないことが多々ありましたんで
とりあえず判明してるやつの解決策を追記しておきます。
各ライブラリの最新Verはpkgs.orgから探したらよいのかな

コケポイント① openjpeg無いよエラー

エラー: パッケージ: ImageMagick-libs-7.0.8-68.x86_64 (/ImageMagick-libs-7.0.8-68.x86_64)
             要求: libopenjp2.so.7()(64bit)

openjpegって一見分からねえですがパッケージ取ってきてダイレクトに入れます。
書いてて気付いたけどそのままyum installで良かった。。。

wget http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/o/openjpeg2-2.3.1-1.el7.x86_64.rpm
rpm -Uvh openjpeg2-2.3.1-1.el7.x86_64.rpm

後述のdevelを入れる際にopenjpeg-devel入れろとも言われるので合わせて対応。
openjpeg-devel入れるのにopenjpeg-toolsも入れろと言われるので(ry

次に本体

yum install https://imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-7.0.8-68.x86_64.rpm

develも入れておきたいが公式には載っていない...
けど一応存在するようである

yum install https://imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-devel-7.0.8-68.x86_64.rpm

これでOK

magick --version
Version: ImageMagick 7.0.8-68 Q16 x86_64 2019-05-12 https://imagemagick.org
Copyright: © 1999-2019 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenMP(3.1) 
Delegates (built-in): bzlib cairo djvu fftw fontconfig freetype gslib jng jp2 jpeg lcms ltdl lzma openexr pangocairo png ps rsvg tiff webp wmf x xml zlib

2019/10/07修正
最近のトレンドは
convert --versionではなく
magick --versionだそうです

Imagickのインストール

まずpeclコマンドを使えるようにする

yum install php-pear
pecl version
PEAR Version: 1.10.9
PHP Version: 7.2.18
Zend Engine Version: 3.2.0

imagickをインストール

pecl install imagick

コケポイント②phpize無いよエラー

peclコマンド叩いたら稀に出ます

Can't find PHP headers in /usr/include/php
The php-devel package is required for use of this command.
ERROR: `phpize' failed

php-develを入れて解決

yum install php-devel

確認

pecl list
Installed packages, channel pecl.php.net:
=========================================
Package Version State
imagick 3.4.4   stable

php.iniにextensionを追加する

php.ini
[PECL]
extension=imagick.so

Apache再起動してphpモジュール確認

service httpd graceful
php -m | grep imagick
imagick

ついでにphpinfo();なりでimagickが追加されてることを確認する。

それでもimagickが動かない

追記 2020-06

ちゃんとの上の手順でやったのにphpinfoにimagickが出ないって場合があると思いますが
phpをcgi形式で稼働させてないでしょうか
apacheの再読み込みだけでなくphp-fpmも再起動してあげてください

$ service php-fpm restart

たぶんこれで出ると思います。

おわり。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした