endaaman.com

2015-11-19

Tips

Ubuntu15.10でngx_small_lightを追加してnginxをコンパイルしようとしてめっちゃ苦戦した話

辛すぎたけど勉強にはなった。

TL;DR

Ubuntu15.04以降でngx_small_lightを追加してNginxをビルドするには以下に注意し、対策をする必要がある。

ImageMagickのWand-configが普通にaptから取ってくるだけではパスに展開されない

sudo apt-get install libmagickwand-devWand-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-devWand-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と同様にしてやっていけるようになったわけである。


©2024 endaaman.com