TL;DR
Ubuntu15.04以降でngx_small_light
を追加してNginxをビルドするには以下に注意し、対策をする必要がある。
ImageMagickのWand-config
が普通にaptから取ってくるだけではパスに展開されない
sudo apt-get install libmagickwand-dev
でWand-config
は/usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/bin-Q16/Wand-config
に展開される。シンボリックリンクを貼るなり、一時的にパスを通すなりして$ Wand-config
が通るようにしておく。
Nginxの./configure
時に「checking for ngx_small_light dependencies ... not found
」と言われてしまう**
config.in
か、./setup
で出力されるconfig
を
-ngx_feature_test="MagickWandGenesis();
+ngx_feature_test="IsMagickWandInstantiated();
と書き換える。
<p style="color: blue">2016/5/4 追記:現在はサムネイル生成はimage_filterを使うようになってしまったのでXenialでは検証していません。</p>
<br><br>
概要
このサイトと、あとバイトで作ったサイトでNginxの拡張モジュールであるngx_small_lightを使っているのだが、それがUbuntu15.10(wily)でうまく導入できなかったけど、なんとかまっとうな方法でnginxに組み込めるようになったという話。 ちなみにVagrantを使って確認した感じ、Ubuntu14.04(trusty)まではこの問題は起きず、Ubuntu15.04(vivid)以降から起こるようである。
依存のImageMagickをインストールする
sudo apt-get install imagemagick libmagickwand-dev
imagemagick
はいらないかも。libmagickwand-dev
ってのは15.04以降からlibmagickwand-6.q16-dev
のエイリアスのようになっていて、ImageMagickのバージョン6.8.9.9-5が入るようになっている。まずこいつが若干曲者である。ngx_small_light
は./setup
コマンドの中で、nginxに渡すための依存しているヘッダーファイルと共有ライブラリのパスをWand-config
というコマンドから引っ張っているのだが、libmagickwand-6.q16-dev
はWand-config
はパスの通った場所に展開されず、Wand-config
が見つからない。(参考:wily の amd64 アーキテクチャ用 libmagickwand-6.q16-devパッケージのファイル一覧
)
sudo ln -s /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/bin-Q16/Wand-config /usr/local/bin
などとしてパスの通った場所にWand-config
を無理やり配置することでちゃんと依存関係を取得できるようになる。
要は「デフォルトで/usr/binにWand-configを展開してくれない」てだけの話なのだが、このWand-config
というのが若干曲者だった。Ubuntuは見つからないコマンドが叩かれた時に「このパッケージをインストールすればそのコマンド使えるようになるで^^」って教えてくれることがあるんだけど、Wand-config
って素で打つと
vagrant@vagrant-ubuntu-wily-64:~$ Wand-config
The program 'Wand-config' is currently not installed. To run 'Wand-config' please ask your administrator to install the package 'graphicsmagick-libmagick-dev-compat'
というサジェストが出る。「ああこれは、sudo apt-get install graphicsmagick-libmagick-dev-compat
すりゃいいのね」っと思うかもしれないが、これはGraphicsMagick
というライブラリでありImageMagick
とは別物なので、ngx_small_light
で使うことはできない(実際にはフォークだがAPI互換なし。少し細工すれば使えるかも?)。これはaptのレポを管理してる人たちからの「これからはImageMagick
よりGraphicsMagick
を使いましょうね」という啓示なのかもしれないが、フォークだけあってAPIなどがソックリでかなり惑わされた。
自分は上に書いたようにパスの通った場所にリンクを張った。環境が汚れるのが嫌なら./setup
の前にexport PATH=/usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/bin-Q16:$PATH
みたいにして一時的にパスを通すってやり方でもいいかもしれない。
なぜか./configure
でコケる
ここまでちゃんと設定できていても、そのまま./setup
するとchecking for ngx_small_light dependencies ... not found
となって、nginxに組み込むことができない。これもまた非常紛らわしい。nginxの拡張に使うconfigがそもそも存在しなくても全く同じような警告が出るからだ。
Vagrantでいくつか環境を用意してやってみたがソースからImageMagickをインストールしている場合は、wilyとvividのaptのものとバージョンであっても問題なく構成できた。どうやらaptで配信されるImageMagickに固有で起こる問題なようだ。とにかく、
-ngx_feature_test="MagickWandGenesis();
+ngx_feature_test="IsMagickWandInstantiated();
と書き換えと動くのである。Test if MagickWandGenesis() or MagickWandTerminus() calledというスレッドでも作者が
> Try IsMagickInstantiated().
と言っているのでそれに従ったという感じ。ただAPIリファレンスを見てみるとIsMagickInstantiated()
自体はdeprecatedに入っていたので代替っぽいIsMagickWandInstantiated()
にしたって感じ。どうにせよあまり理解の及ぶ話ではなかった。
環境構築は辛い
OS XにせよVPSにせよこうやって環境を作ってるときが一番つらい。なんか関わりの有りそうなワードでググって、ちょっと試して、どうしてうまくいったか考えて……みたいのを毎回やるんだけど、毎回しんどい。ともあれ、なんとかデスクトップのUbuntu15.10にも普段の環境を作れたので、OS Xと同様にしてやっていけるようになったわけである。